diff --git a/AUTHORS.rst b/AUTHORS.rst index 58c1bfb..3b27f00 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -23,4 +23,4 @@ In chronological order: - Sébastien Eustace (`@sdispater `_) - Evan Mattiza (`@emattiza `_) - Dima Spivak (`@dimaspivak `_) -- Tom Barron (`@tbarron `_) +- Tom Barron (`@dtbarron `_) diff --git a/maya/core.py b/maya/core.py index a27e73f..17db01f 100644 --- a/maya/core.py +++ b/maya/core.py @@ -183,12 +183,12 @@ class MayaDT(object): def from_datetime(klass, dt): """Returns MayaDT instance from datetime.""" return klass(klass.__dt_to_epoch(dt)) - + @classmethod @validate_arguments_type_of_function(time.struct_time) def from_struct(klass, struct, timezone=pytz.UTC): - """Returns MayaDT instance from a 9-tuple struct""" - struct_time = time.mktime(struct) + """Returns MayaDT instance from a 9-tuple struct (assumed to be from gmtime())""" + struct_time = time.mktime(struct) - utc_offset() dt = Datetime.fromtimestamp(struct_time, timezone) return klass(klass.__dt_to_epoch(dt)) @@ -261,6 +261,10 @@ class MayaDT(object): @property def day(self): return self.datetime().day + + @property + def date(self): + return self.datetime().date() @property def week(self): @@ -305,6 +309,16 @@ class MayaDT(object): return humanize.naturaltime(dt) +def utc_offset(): + """Returns the current local time offset from UTC accounting for DST """ + ts = time.localtime() + if ts[-1]: + offset = time.altzone + else: + offset = time.timezone + return offset + + def to_utc_offset_naive(dt): if dt.tzinfo is None: return dt diff --git a/tests/test_maya.py b/tests/test_maya.py index fb3b6fd..3300f5b 100644 --- a/tests/test_maya.py +++ b/tests/test_maya.py @@ -67,19 +67,30 @@ def test_parse_iso8601(): def test_struct(): - ts = time.gmtime() + now = round(time.time()) + ts = time.gmtime(now) m = maya.MayaDT.from_struct(ts) - dt = Datetime.fromtimestamp(time.mktime(ts), pytz.UTC) + dt = Datetime.fromtimestamp(now, pytz.UTC) assert m._epoch != None assert m.datetime() == dt - ts = time.localtime() + ts = time.localtime(now) m = maya.MayaDT.from_struct(ts) - dt = Datetime.fromtimestamp(time.mktime(ts), pytz.UTC) + dt = Datetime.fromtimestamp(time.mktime(ts) - maya.core.utc_offset(), pytz.UTC) assert m._epoch != None assert m.datetime() == dt +def test_issue_104(): + e = 1507756331 + t = Datetime.utcfromtimestamp(e) + t = maya.MayaDT.from_datetime(t) + assert str(t) == 'Wed, 11 Oct 2017 21:12:11 GMT' + t = time.gmtime(e) + t = maya.MayaDT.from_struct(t) + assert str(t) == 'Wed, 11 Oct 2017 21:12:11 GMT' + + def test_human_when(): r1 = maya.when('yesterday') r2 = maya.when('today')