Vous devez garder un œil sur les informations relatives au fuseau horaire, car vous risquez d'avoir des problèmes en comparant des dates qui ne tiennent pas compte du fuseau horaire avec d'autres qui en tiennent compte.
Il est probablement préférable de toujours les rendre conscients du tz (même si ce n'est qu'en tant qu'UTC), à moins que vous ne sachiez vraiment pourquoi il ne serait pas utile de le faire.
#-----------------------------------------------
import datetime
import pytz
import dateutil.parser
#-----------------------------------------------
utc = pytz.utc
BERLIN = pytz.timezone('Europe/Berlin')
#-----------------------------------------------
def to_iso8601(when=None, tz=BERLIN):
if not when:
when = datetime.datetime.now(tz)
if not when.tzinfo:
when = tz.localize(when)
_when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
return _when[:-8] + _when[-5:] # Remove microseconds
#-----------------------------------------------
def from_iso8601(when=None, tz=BERLIN):
_when = dateutil.parser.parse(when)
if not _when.tzinfo:
_when = tz.localize(_when)
return _when
#-----------------------------------------------
28 votes
Il est bon de garder à l'esprit que ce n'est pas tout à fait un duplicata du problème contre lequel il a été fermé. Le problème lié se réfère spécifiquement à RFC 3339 tandis que celui-ci fait référence aux chaînes ISO 8601. La syntaxe RFC 3339 est un sous-ensemble de la syntaxe ISO 8601 (définie dans la norme non libre ISO 8601 qui, comme la plupart des normes ISO, doit être piratée ou faire l'objet d'une énorme redevance pour être lue). La chaîne de date présentée dans cette question est une date ISO 8601, mais PAS une date RFC 3339. Les décalages UTC sont obligatoires dans les dates RFC 3339, et aucun n'est fourni ici.