2 chiffres à l'aide de strptime() n'est pas en mesure d'analyser les anniversaires très bien
-
17-09-2020 - |
Question
Considérez les points suivants anniversaires (comme dob
):
- 1-Juin-68
- 1-Juin-69
Lorsque analysé avec Python datetime.strptime(dob, '%d-%b-%y')
rendement:
datetime.datetime(2068, 6, 1, 0, 0)
datetime.datetime(1969, 6, 1, 0, 0)
Bien sûr, ils sont censés être nés dans la même décennie, mais maintenant il n'est même pas dans le même siècle!
Selon l' docs c'est parfaitement valide comportement:
Lorsque les années à 2 chiffres sont acceptés, ils sont convertis selon POSIX ou X/Open standard:les valeurs 69-99 sont mappés à 1969-1999, et les valeurs 0-68 sont mappés à 2000-2068.
Je comprends pourquoi la fonction est mis en place comme cela, mais est-il un moyen de contourner cela?Peut-être avec la définition de vos propres gammes pour les années à 2 chiffres?
La solution
Si vous êtes toujours en train de l'utiliser pour les anniversaires, juste soustraire 100 si l'année est après maintenant:
if d > datetime.now():
d = datetime(d.year - 100, d.month, d.day)
Autres conseils
Cette fonction de quarts de l'année 1950:
def millenium(year, shift=1950):
return (year-shift)%100 + shift
Si vous vous attendez à un anniversaire, vous pouvez toujours juste manuellement massage les données d'une date quelconque dans l'avenir est réglé automatiquement en arrière d'un siècle, ou quelque chose du genre.