2010-07-19 20 views
6

Considérez les anniversaires suivants (comme dob):2 ans chiffres à l'aide strptime() ne sont pas en mesure d'analyser les anniversaires très bien

  • 1-juin-68
  • 1-juin-69

avec Python Si on analyse de datetime.strptime(dob, '%d-%b-%y') donnera:

  • datetime.datetime(2068, 6, 1, 0, 0)
  • datetime.datetime(1969, 6, 1, 0, 0)

Mais bien sûr qu'ils sont censés être nés dans la même décennie, mais maintenant il est même pas dans le même siècle!

Selon le docs ce comportement est parfaitement valable:

Quand sont acceptés, ils sont convertis années à 2 chiffres selon la norme POSIX ou X/Open: Les valeurs 69-99 sont mises en correspondance à 1969 -1999, et les valeurs 0-68 sont mappées à 2000-2068.

Je comprends pourquoi la fonction est configurée comme ceci, mais y a-t-il un moyen de contourner ce problème? Peut-être avec la définition de vos propres plages pour les années à deux chiffres?

Répondre

12

Si vous êtes toujours utiliser pour les anniversaires, juste soustraire 100 si l'année est maintenant après:

if d > datetime.now(): 
    d = datetime(d.year - 100, d.month, d.day) 
+1

Il est presque toujours une bonne idée de faire ce genre de tests de santé mentale. –

+0

Bonne réponse - en fonction des situations d'utilisation réelles, soustraire 100 ans pour les dates dans le futur est probablement un bon moyen de gérer les anniversaires. –

+0

Cela semble une réponse saine pour mes besoins. Merci. – casr

0

Si vous vous attendez à un anniversaire, vous pouvez toujours juste masser manuellement les données - toute date dans le futur est automatiquement en retrait d'un siècle, ou une telle.

2

Cette fonction décale l'année 1950:

def millenium(year, shift=1950): 
    return (year-shift)%100 + shift