Looking for python Answers? Try Ask4KnowledgeBase
Looking for python Keywords? Try Ask4Keywords

Python Language Analyse d'un horodatage ISO 8601 arbitraire avec des bibliothèques minimales


Exemple

Python ne prend en charge que l'analyse des horodatages ISO 8601. Pour le strptime vous devez savoir exactement dans quel format il se trouve. Comme complication, la cordification d'un datetime est un horodatage ISO 8601, avec un espace comme séparateur et fraction de 6 chiffres:

str(datetime.datetime(2016, 7, 22, 9, 25, 59, 555555))
# '2016-07-22 09:25:59.555555'

mais si la fraction est 0, aucune partie fractionnaire n'est sortie

str(datetime.datetime(2016, 7, 22, 9, 25, 59, 0))
# '2016-07-22 09:25:59'

Mais ces deux formes nécessitent un format différent pour le strptime . De plus, strptime' does not support at all parsing minute timezones that have a : in it, thus 2016-07-22 09: 25: 59 + 0300 can be parsed, but the standard format 2016-07-22 09:25:59 +03: 00` ne peut pas.

Il existe une bibliothèque de fichiers iso8601 appelée iso8601 qui analyse correctement les horodatages ISO 8601 et uniquement ceux-ci.

Il supporte les fractions et les fuseaux horaires, et le séparateur T avec une seule fonction:

import iso8601
iso8601.parse_date('2016-07-22 09:25:59')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22 09:25:59+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<FixedOffset '+03:00' ...>)
iso8601.parse_date('2016-07-22 09:25:59Z')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22T09:25:59.000111+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, 111, tzinfo=<FixedOffset '+03:00' ...>)

Si aucun fuseau horaire n'est défini, iso8601.parse_date est défini iso8601.parse_date défaut sur UTC. La zone par défaut peut être modifiée avec l'argument mot-clé default_zone . Notamment, s'il s'agit de None au lieu de la valeur par défaut, les horodatages qui n'ont pas de fuseau horaire explicite sont renvoyés en tant que dat date naïves à la place:

iso8601.parse_date('2016-07-22T09:25:59', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59)
iso8601.parse_date('2016-07-22T09:25:59Z', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)