Sérialiser et parser une date en Python: formats de strftime/strptime et timestamps

Ça fait 10 ans que j’en fais, et je ne me souviens jamais des lettres à utiliser pour les formats. Pourtant j’utilise tout le temps le même format: celui de MySQl et JSON par défaut, avec en plus les microsecondes, car l’odre alphanumérique de ce format est le même que l’ordre chronologique, ce qui rend son traitement facile.

Je le met ici pour l’avoir toujours sous la main. Marre de chercher si truc est en minuscule, et marchin en majuscule. Je me fais baiser à chaque fois.

Sérialiser une date pour avoir: année, mois, jour, heure, minute, seconde, microsecondes :

>>> import datetime
>>> datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
>>> '2012-07-22 16:19:00.539570'

A l’inverse, parser une date:

>>> datetime.datetime.strptime('2012-07-22 16:19:00.539570', '%Y-%m-%d %H:%M:%S.%f')
>>> datetime.datetime(2012, 7, 22, 16, 19, 0, 539570)

Tous les formats sont listés ici.

Et tant qu’on y est, le snippet de manipulation de timestamp (qui pour le fun, n’est pas par défaut dans le module datetime):

>>> import calendar
>>> calendar.timegm(d.utctimetuple()) # d'un objet date vers un timestamp
>>> 1342973940
>>> datetime.datetime.fromtimestamp(1342973940) # et l'inverse
>>> datetime.datetime(2012, 7, 22, 18, 19)

Le timestamp est un timestamp basé sur une epoch of 1970 et un format POSIX, avec toute ce que ça implique, et notamment le fait qu’on perd les microseconde.

No related posts.

flattr this!

4 comments

  1. Pour le gars qui a cherché:

    python date hier

    >>> import datetime
    >>> print datetime.datetime.now() - datetime.timedelta(1)
    2012-08-01 13:51:06.508446
  2. François

    Il y a un namespace incorrect :
    datetime.strptime('2012-07-22 16:19:00.539570', '%Y-%m-%d %H:%M:%S.%f')

  3. Fixed.

  4. Billou

    Concernant la conversion timestamp/date/timestamp :

    calendar.timegm(d.utctimetuple())
    => cela fournit un timestamp en UTC (sans flottant)

    datetime.datetime.fromtimestamp(1342973940)
    => cela fournit une date LOCAL

    Si l’on veut fournir une date en UTC, mieux vaut faire :
    datetime.datetime.utcfromtimestamp(1342973940)

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent