Skip to content

Commit

Permalink
Merge pull request #328 from Flared/fix/locale-timestamp
Browse files Browse the repository at this point in the history
Fix locale timestamp
  • Loading branch information
boxed committed Jan 23, 2020
2 parents be7034d + b88d004 commit a0e3ad6
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 7 deletions.
16 changes: 16 additions & 0 deletions freezegun/api.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import dateutil
import datetime
import functools
import sys
Expand All @@ -21,6 +22,8 @@
MayaDT = None

_TIME_NS_PRESENT = hasattr(time, 'time_ns')
_EPOCH = datetime.datetime(1970, 1, 1)
_EPOCHTZ = datetime.datetime(1970, 1, 1, tzinfo=dateutil.tz.UTC)

real_time = time.time
real_localtime = time.localtime
Expand Down Expand Up @@ -335,6 +338,19 @@ def astimezone(self, tz=None):
tz = tzlocal()
return datetime_to_fakedatetime(real_datetime.astimezone(self, tz))

@classmethod
def fromtimestamp(cls, t, tz=None):
if tz is None:
return real_datetime.fromtimestamp(
t, tz=dateutil.tz.tzoffset("freezegun", cls._tz_offset())
).replace(tzinfo=None)
return datetime_to_fakedatetime(real_datetime.fromtimestamp(t, tz))

def timestamp(self):
if self.tzinfo is None:
return (self - _EPOCH - self._tz_offset()).total_seconds()
return (self - _EPOCHTZ).total_seconds()

@classmethod
def now(cls, tz=None):
now = cls._time_to_freeze() or real_datetime.now()
Expand Down
27 changes: 20 additions & 7 deletions tests/test_datetimes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import locale
import sys
from unittest import SkipTest
from dateutil.tz import UTC

import pytest
from tests import utils
Expand Down Expand Up @@ -449,9 +450,7 @@ def test_nested_context_manager():
def _assert_datetime_date_and_time_are_all_equal(expected_datetime):
assert datetime.datetime.now() == expected_datetime
assert datetime.date.today() == expected_datetime.date()
datetime_from_time = datetime.datetime.fromtimestamp(time.time())
timezone_adjusted_datetime = datetime_from_time + datetime.timedelta(seconds=time.timezone)
assert timezone_adjusted_datetime == expected_datetime
assert datetime.datetime.fromtimestamp(time.time()) == expected_datetime


def test_nested_context_manager_with_tz_offsets():
Expand Down Expand Up @@ -689,7 +688,6 @@ def test_time_ns():
assert time.time_ns() != expected_timestamp * 1e9


@pytest.mark.skip("timezone handling is currently incorrect")
def test_compare_datetime_and_time_with_timezone(monkeypatch):
"""
Compare the result of datetime.datetime.now() and time.time() in a non-UTC timezone. These
Expand All @@ -700,13 +698,28 @@ def test_compare_datetime_and_time_with_timezone(monkeypatch):
m.setenv("TZ", "Europe/Berlin")
time.tzset()

dt1 = datetime.datetime.now()
dt2 = datetime.datetime.fromtimestamp(time.time())
assert dt1 == dt2
now = datetime.datetime.now()
assert now == datetime.datetime.fromtimestamp(time.time())
assert now == datetime.datetime.utcfromtimestamp(time.time())
assert now == datetime.datetime.utcnow()
assert now.timestamp() == time.time()
finally:
time.tzset() # set the timezone back to what is was before


def test_timestamp_with_tzoffset():
with freeze_time("2000-01-01", tz_offset=6):
utcnow = datetime.datetime(2000, 1, 1, 0)
nowtz = datetime.datetime(2000, 1, 1, 0, tzinfo=UTC)
now = datetime.datetime(2000, 1, 1, 6)
assert now == datetime.datetime.now()
assert now == datetime.datetime.fromtimestamp(time.time())
assert now.timestamp() == time.time()
assert nowtz.timestamp() == time.time()

assert utcnow == datetime.datetime.utcfromtimestamp(time.time())
assert utcnow == datetime.datetime.utcnow()

@pytest.mark.skip("timezone handling is currently incorrect")
def test_datetime_in_timezone(monkeypatch):
"""
Expand Down

0 comments on commit a0e3ad6

Please sign in to comment.