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:
parent
4858953064
commit
dae802b057
1 changed files with 43 additions and 9 deletions
|
@ -55,6 +55,11 @@ try:
|
||||||
except:
|
except:
|
||||||
pytz = None
|
pytz = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
import dateutil.tz
|
||||||
|
except:
|
||||||
|
dateutil = None
|
||||||
|
|
||||||
DEVNULL = open(os.devnull, 'w')
|
DEVNULL = open(os.devnull, 'w')
|
||||||
|
|
||||||
def find_rid_plage(rid):
|
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"))
|
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):
|
def localized_datetime(date=None, tz=None):
|
||||||
"""Returns a datetime from generalized time format
|
"""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:
|
if '-' in gtf or '+' in gtf:
|
||||||
date, tz = gtf[0:14], gtf[14:]
|
date, tz = gtf[0:14], gtf[14:]
|
||||||
else:
|
else:
|
||||||
date = gtf.replace("Z", '')
|
date = gtf.replace("Z", '')
|
||||||
tz = '+0000'
|
tz = '+0000'
|
||||||
the_date = datetime.datetime.strptime(date, "%Y%m%d%H%M%S")
|
return localized_datetime(date, tz)
|
||||||
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
|
|
||||||
|
|
||||||
def datetime_to_generalized_time_format(datetime_obj):
|
def datetime_to_generalized_time_format(datetime_obj):
|
||||||
"""Transforms a datetime to a GTF"""
|
"""Transforms a datetime to a GTF"""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue