mirror of
https://github.com/gryf/ebook-converter.git
synced 2026-01-02 00:22:25 +01:00
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from datetime import datetime
|
|
|
|
from dateutil.tz import tzlocal, tzutc, tzoffset
|
|
|
|
from ebook_converter.constants import plugins
|
|
# speedup, err = plugins['speedup']
|
|
# if not speedup:
|
|
# raise RuntimeError(err)
|
|
|
|
|
|
class SafeLocalTimeZone(tzlocal):
|
|
|
|
def _isdst(self, dt):
|
|
# This method in tzlocal raises ValueError if dt is out of range (in
|
|
# older versions of dateutil)
|
|
# In such cases, just assume that dt is not DST.
|
|
try:
|
|
return super(SafeLocalTimeZone, self)._isdst(dt)
|
|
except Exception:
|
|
pass
|
|
return False
|
|
|
|
def _naive_is_dst(self, dt):
|
|
# This method in tzlocal raises ValueError if dt is out of range (in
|
|
# newer versions of dateutil)
|
|
# In such cases, just assume that dt is not DST.
|
|
try:
|
|
return super(SafeLocalTimeZone, self)._naive_is_dst(dt)
|
|
except Exception:
|
|
pass
|
|
return False
|
|
|
|
|
|
utc_tz = tzutc()
|
|
local_tz = SafeLocalTimeZone()
|
|
del tzutc, tzlocal
|
|
UNDEFINED_DATE = datetime(101,1,1, tzinfo=utc_tz)
|
|
|
|
|
|
def parse_iso8601(date_string, assume_utc=False, as_utc=True):
|
|
if not date_string:
|
|
return UNDEFINED_DATE
|
|
dt, aware, tzseconds = speedup.parse_iso8601(date_string)
|
|
tz = utc_tz if assume_utc else local_tz
|
|
if aware: # timezone was specified
|
|
if tzseconds == 0:
|
|
tz = utc_tz
|
|
else:
|
|
sign = '-' if tzseconds < 0 else '+'
|
|
description = "%s%02d:%02d" % (sign, abs(tzseconds) // 3600, (abs(tzseconds) % 3600) // 60)
|
|
tz = tzoffset(description, tzseconds)
|
|
dt = dt.replace(tzinfo=tz)
|
|
if as_utc and tz is utc_tz:
|
|
return dt
|
|
return dt.astimezone(utc_tz if as_utc else local_tz)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
print(parse_iso8601(sys.argv[-1]))
|