Fonctionnalité pour générer un datetime timezone aware

* Prend un truc de la forme %Y%m%d%H%M%S, et une tz de la forme [+-]XXXX
 * On peut ne pas fournir le premier argument, auquel cas on prend la
 date actuele
 * On peut ne pas fournir la timezone, auquel cas elle sera fixée à
 celle du système si dateutil est installé, ou à UTC à défaut.
 * Si pas de pytz et que pas de tz fournie, dateutil est utilisé.
 * Si pas de pytz et pas de dateutil, le datetime ne sera pas timezone
 aware
This commit is contained in:
Pierre-Elliott Bécue 2015-09-24 23:23:44 +02:00
parent 4858953064
commit dae802b057

View file

@ -55,6 +55,11 @@ try:
except:
pytz = None
try:
import dateutil.tz
except:
dateutil = None
DEVNULL = open(os.devnull, 'w')
def find_rid_plage(rid):
@ -340,21 +345,50 @@ def from_generalized_time_format(gtf):
"""
return time.mktime(time.strptime(gtf.split("-", 1)[0].split("+", 1)[0].split('Z', 1)[0], "%Y%m%d%H%M%S"))
def datetime_from_generalized_time_format(gtf):
"""Returns a datetime from generalized time format
def localized_datetime(date=None, tz=None):
"""Builds a datetime object based on a date string formatted as
%Y%m%d%H%M%S, and a tz timezone looking like +0200"""
"""
_notz = (tz is None)
# Shit may happen
if tz == "Z":
tz = "+0000"
if date is not None:
the_date = datetime.datetime.strptime(date, "%Y%m%d%H%M%S")
else:
the_date = datetime.datetime.now()
# No timezone means we try to get from the system
# if we have dateutil, else, UTC.
if tz is None:
if dateutil is not None:
tz = datetime.datetime.now(dateutil.tz.tzlocal()).strftime("%z")
else:
tz = "+0000"
# No pytz means no timezoned datetime
if pytz is not None:
the_timezone = pytz.FixedOffset(int(tz[0:-2])*60 + int(tz[-2:]))
the_date = the_timezone.localize(the_date)
the_date = the_timezone.normalize(the_date)
else:
# Maybe we can do something
if dateutil is not None:
if _notz:
the_date.replace(tzinfo=dateutil.tz.tzlocal())
return the_date
def datetime_from_generalized_time_format(gtf):
"""Returns a datetime from generalized time format"""
if '-' in gtf or '+' in gtf:
date, tz = gtf[0:14], gtf[14:]
else:
date = gtf.replace("Z", '')
tz = '+0000'
the_date = datetime.datetime.strptime(date, "%Y%m%d%H%M%S")
if pytz is not None:
the_timezone = pytz.FixedOffset(int(tz[0:-2])*60 + int(tz[-2:]))
the_date = the_timezone.localize(the_date)
the_date = the_timezone.normalize(the_date)
return the_date
return localized_datetime(date, tz)
def datetime_to_generalized_time_format(datetime_obj):
"""Transforms a datetime to a GTF"""