diff --git a/python/helpers/typeshed/stdlib/2/datetime.pyi b/python/helpers/typeshed/stdlib/2/datetime.pyi index 6174b9a477e1..f2d45d97e57f 100644 --- a/python/helpers/typeshed/stdlib/2/datetime.pyi +++ b/python/helpers/typeshed/stdlib/2/datetime.pyi @@ -21,7 +21,7 @@ class date(object): max = ... # type: date resolution = ... # type: timedelta - def __init__(self, year: int, month: int = ..., day: int = ...) -> None: ... + def __init__(self, year: int, month: int, day: int) -> None: ... @classmethod def fromtimestamp(cls, t: float) -> date: ... @@ -125,11 +125,9 @@ class timedelta(SupportsAbs[timedelta]): @overload def __floordiv__(self, other: int) -> timedelta: ... @overload - def __truediv__(self, other: timedelta) -> float: ... + def __div__(self, other: timedelta) -> float: ... @overload - def __truediv__(self, other: float) -> timedelta: ... - def __mod__(self, other: timedelta) -> timedelta: ... - def __divmod__(self, other: timedelta) -> Tuple[int, timedelta]: ... + def __div__(self, other: float) -> timedelta: ... def __le__(self, other: timedelta) -> bool: ... def __lt__(self, other: timedelta) -> bool: ... def __ge__(self, other: timedelta) -> bool: ... @@ -142,7 +140,7 @@ class datetime(object): max = ... # type: datetime resolution = ... # type: timedelta - def __init__(self, year: int, month: int = ..., day: int = ..., hour: int = ..., + def __init__(self, year: int, month: int, day: int, hour: int = ..., minute: int = ..., second: int = ..., microseconds: int = ..., tzinfo: tzinfo = ...) -> None: ... @@ -161,7 +159,7 @@ class datetime(object): @property def microsecond(self) -> int: ... @property - def tzinfo(self) -> _tzinfo: ... + def tzinfo(self) -> Optional[_tzinfo]: ... @classmethod def fromtimestamp(cls, t: float, tz: _tzinfo = ...) -> datetime: ... @@ -181,7 +179,6 @@ class datetime(object): def __format__(self, fmt: str) -> str: ... def toordinal(self) -> int: ... def timetuple(self) -> struct_time: ... - def timestamp(self) -> float: ... def utctimetuple(self) -> struct_time: ... def date(self) -> _date: ... def time(self) -> _time: ... @@ -189,7 +186,7 @@ class datetime(object): def replace(self, year: int = ..., month: int = ..., day: int = ..., hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo: Union[_tzinfo, bool] = ...) -> datetime: ... - def astimezone(self, tz: _tzinfo = ...) -> datetime: ... + def astimezone(self, tz: _tzinfo) -> datetime: ... def ctime(self) -> str: ... def isoformat(self, sep: str = ...) -> str: ... @classmethod diff --git a/python/helpers/typeshed/stdlib/3/datetime.pyi b/python/helpers/typeshed/stdlib/3/datetime.pyi index 7925226f41b7..a894ab859944 100644 --- a/python/helpers/typeshed/stdlib/3/datetime.pyi +++ b/python/helpers/typeshed/stdlib/3/datetime.pyi @@ -31,7 +31,7 @@ class date: max = ... # type: date resolution = ... # type: timedelta - def __init__(self, year: int, month: int = ..., day: int = ...) -> None: ... + def __init__(self, year: int, month: int, day: int) -> None: ... @classmethod def fromtimestamp(cls, t: float) -> date: ... diff --git a/python/src/com/jetbrains/python/codeInsight/typing/PyTypeShed.kt b/python/src/com/jetbrains/python/codeInsight/typing/PyTypeShed.kt index cbd5e666ce91..d2c6fd3842d0 100644 --- a/python/src/com/jetbrains/python/codeInsight/typing/PyTypeShed.kt +++ b/python/src/com/jetbrains/python/codeInsight/typing/PyTypeShed.kt @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,7 +40,7 @@ object PyTypeShed { private val ONLY_SUPPORTED_PY2_MINOR = 7 private val SUPPORTED_PY3_MINORS = 2..6 // TODO: Warn about unresolved `import typing` but still resolve it internally for type inference - val WHITE_LIST = setOf("typing", "six", "__builtin__", "builtins", "exceptions", "types") + val WHITE_LIST = setOf("typing", "six", "__builtin__", "builtins", "exceptions", "types", "datetime") private val BLACK_LIST = setOf() /** diff --git a/python/testData/typeshed/stdlib/2/datetime_test.py b/python/testData/typeshed/stdlib/2/datetime_test.py new file mode 100644 index 000000000000..3fb41bdfddfc --- /dev/null +++ b/python/testData/typeshed/stdlib/2/datetime_test.py @@ -0,0 +1,211 @@ +def test_date(): + from datetime import date, timedelta + + d = date(2000, 12, 15) + + assert d.min == date(1, 1, 1) + assert d.max == date(9999, 12, 31) + assert d.resolution == timedelta(1) + + assert date.fromtimestamp(2048) == date(1970, 1, 1) + assert isinstance(date.today(), date) + assert date.fromordinal(2048) == date(6, 8, 10) + + assert d.year == 2000 + assert d.month == 12 + assert d.day == 15 + + assert d.ctime() == "Fri Dec 15 00:00:00 2000" + assert d.strftime("%d") == "15" + assert format(d, "%d") == "15" + assert d.isoformat() == "2000-12-15" + assert [d.timetuple()[i] for i in range(3)] == [2000, 12, 15] + assert d.toordinal() == 730469 + + assert d.replace() == date(2000, 12, 15) + assert d.replace(2001) == date(2001, d.month, d.day) + assert d.replace(2001, 11) == date(2001, 11, d.day) + assert d.replace(2001, 11, 16) == date(2001, 11, 16) + + assert d < date(2000, 12, 16) + assert d <= date(2000, 12, 15) + assert d > date(2000, 12, 14) + assert d >= date(2000, 12, 15) + + assert d + timedelta(3) == date(2000, 12, 18) + assert d - timedelta(3) == date(2000, 12, 12) + assert d - date(2000, 6, 8) == timedelta(190) + + assert d.weekday() == 4 + assert d.isoweekday() == 5 + assert d.isocalendar() == (2000, 50, 5) + + +def test_time(): + from datetime import time, timedelta + + time() + time(23) + + t1 = time(23, 25) + t = time(23, 25, 30) + t2 = time(23, 25, 30, 50) + + assert t.min == time() + assert t.max == time(23, 59, 59, 999999) + assert t.resolution == timedelta(microseconds=1) + + assert t.hour == 23 + assert t.minute == 25 + assert t.second == 30 + assert t.microsecond == 0 + assert t.tzinfo is None + + assert t < t2 + assert t <= time(23, 25, 30) + assert t > t1 + assert t >= time(23, 25, 30) + + assert t.isoformat() == "23:25:30" + assert t.strftime("%m") == "01" + assert format(t, "%m") == "01" + + assert t.utcoffset() is None + assert t.tzname() is None + assert t.dst() is None + + assert t.replace(22) == time(22, t.minute, t.second) + assert t.replace(22, 24) == time(22, 24, t.second) + assert t.replace(22, 24, 29) == time(22, 24, 29) + + t3 = time(23, 25, 20, tzinfo=None) + assert t3.tzinfo is None + assert t3.replace(tzinfo=None).tzinfo is None + + +def test_timedelta(): + from datetime import timedelta + + timedelta() + timedelta(5) + timedelta(5, 6) + timedelta(5, 6, 7) + timedelta(5, 6, 7, 8) + timedelta(5, 6, 7, 8, 9) + timedelta(5, 6, 7, 8, 9, 10) + timedelta(5, 6, 7, 8, 9, 10, 11) + + td1 = timedelta(hours=1, minutes=10, seconds=10) + td = timedelta(hours=1, minutes=10, seconds=20) + td2 = timedelta(hours=1, minutes=10, seconds=30) + + assert td.min == timedelta(days=-999999999) + assert td.max == timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999) + assert td.resolution == timedelta(microseconds=1) + + assert td.days == 0 + assert td.seconds == 4220 + assert td.microseconds == 0 + + assert td.total_seconds() == 4220 + + assert td + td1 == timedelta(hours=2, minutes=20, seconds=30) + assert td2 - td == timedelta(seconds=10) + + assert -td == timedelta(days=-1, hours=22, minutes=49, seconds=40) + assert +td == td + + assert abs(td) == td + + assert td.__mul__(2) == timedelta(hours=2, minutes=20, seconds=40) + assert td.__rmul__(2) == timedelta(hours=2, minutes=20, seconds=40) + + assert td.__floordiv__(2) == timedelta(minutes=35, seconds=10) + assert td.__floordiv__(timedelta(minutes=5)) == NotImplemented + + assert td.__div__(2) == timedelta(minutes=35, seconds=10) + assert td.__div__(timedelta(minutes=5)) == NotImplemented + + assert td < td2 + assert td <= timedelta(hours=1, minutes=10, seconds=20) + assert td > td1 + assert td >= timedelta(hours=1, minutes=10, seconds=20) + + +def test_datetime(): + from datetime import datetime, timedelta, date, time + + datetime(2000, 12, 25) + datetime(2000, 12, 25, 23) + datetime(2000, 12, 25, 23, 59) + datetime(2000, 12, 25, 23, 59, 59) + datetime(2000, 12, 25, 23, 59, 59, 60) + dt1 = datetime(2000, 12, 24, 23, 59, 59) + dt = datetime(2000, 12, 25, 23, 59, 59) + dt2 = datetime(2000, 12, 26, 23, 59, 59) + + assert dt.min == datetime(1, 1, 1) + assert dt.max == datetime(9999, 12, 31, 23, 59, 59, 999999) + assert dt.resolution == timedelta(microseconds=1) + + assert dt.year == 2000 + assert dt.month == 12 + assert dt.day == 25 + assert dt.hour == 23 + assert dt.minute == 59 + assert dt.second == 59 + assert dt.microsecond == 0 + assert dt.tzinfo is None + + assert datetime.utcfromtimestamp(2048) == datetime(1970, 1, 1, 0, 34, 8) + assert isinstance(datetime.today(), datetime) + assert datetime.fromordinal(2048) == datetime(6, 8, 10) + assert isinstance(datetime.utcnow(), datetime) + assert datetime.combine(date(2000, 12, 25), time(23, 59, 59)) == dt + assert datetime.strptime("2000 12 25 23 59 59", "%Y %m %d %H %M %S") == dt + + assert dt.strftime("%Y %m %d %H %M %S") == "2000 12 25 23 59 59" + assert format(dt, "%Y %m %d %H %M %S") == "2000 12 25 23 59 59" + + assert dt.toordinal() == 730479 + assert [dt.timetuple()[i] for i in range(6)] == [2000, 12, 25, 23, 59, 59] + assert [dt.utctimetuple()[i] for i in range(6)] == [2000, 12, 25, 23, 59, 59] + assert dt.date() == date(2000, 12, 25) + assert dt.time() == time(23, 59, 59) + assert dt.timetz() == time(23, 59, 59) + assert dt.ctime() == "Mon Dec 25 23:59:59 2000" + assert dt.isoformat() == "2000-12-25T23:59:59" + assert dt.utcoffset() is None + assert dt.tzname() is None + assert dt.dst() is None + assert dt.weekday() == 0 + assert dt.isoweekday() == 1 + assert dt.isocalendar() == (2000, 52, 1) + + assert dt.replace(2001) == datetime(2001, dt.month, dt.day, dt.hour, dt.minute, dt.second) + assert dt.replace(2001, 11) == datetime(2001, 11, dt.day, dt.hour, dt.minute, dt.second) + assert dt.replace(2001, 11, 24) == datetime(2001, 11, 24, dt.hour, dt.minute, dt.second) + assert dt.replace(2001, 11, 24, 22) == datetime(2001, 11, 24, 22, dt.minute, dt.second) + assert dt.replace(2001, 11, 24, 22, 58) == datetime(2001, 11, 24, 22, 58, dt.second) + assert dt.replace(2001, 11, 24, 22, 58, 58) == datetime(2001, 11, 24, 22, 58, 58) + + assert dt < dt2 + assert dt <= datetime(2000, 12, 25, 23, 59, 59) + assert dt > dt1 + assert dt >= datetime(2000, 12, 25, 23, 59, 59) + + assert dt + timedelta(3) == datetime(2000, 12, 28, 23, 59, 59) + assert dt - timedelta(3) == datetime(2000, 12, 22, 23, 59, 59) + assert dt - dt1 == timedelta(1) + + assert datetime.fromtimestamp(2048, None) == datetime(1970, 1, 1, 3, 34, 8) + assert datetime.fromtimestamp(2048) == datetime(1970, 1, 1, 3, 34, 8) + + assert isinstance(datetime.now(None), datetime) + assert isinstance(datetime.now(), datetime) + + dt3 = datetime(2000, 12, 25, 15, 16, 17, tzinfo=None) + assert dt3.tzinfo is None + + dt4 = dt3.replace(tzinfo=None) + assert dt4.tzinfo is None \ No newline at end of file diff --git a/python/testData/typeshed/stdlib/3/datetime_test.py b/python/testData/typeshed/stdlib/3/datetime_test.py new file mode 100644 index 000000000000..bc285b8bdad3 --- /dev/null +++ b/python/testData/typeshed/stdlib/3/datetime_test.py @@ -0,0 +1,276 @@ +def test_timezone(): + from datetime import datetime, timedelta, timezone + + tz_min = timezone(timedelta(minutes=-(60 * 24 - 1))) + tz_max = timezone(timedelta(minutes=60 * 24 - 1)) + + tz1 = timezone(timedelta(hours=2)) + dt1 = datetime(2000, 12, 15, 15, 16, 17, tzinfo=tz1) + + assert tz1.utc == timezone(timedelta()) + assert tz1.min == tz_min + assert tz1.max == tz_max + + assert tz1.tzname(dt1) == "UTC+02:00" + assert tz1.utcoffset(dt1) == timedelta(hours=2) + assert tz1.dst(dt1) is None + assert tz1.fromutc(dt1) == datetime(2000, 12, 15, 17, 16, 17, tzinfo=tz1) + + tz2 = timezone(timedelta(hours=-2), "NaMe") + dt2 = datetime(2000, 12, 15, 15, 16, 17, tzinfo=tz2) + + assert tz2.utc == timezone(timedelta()) + assert tz2.min == tz_min + assert tz2.max == tz_max + + assert tz2.tzname(None) == "NaMe" + assert tz2.utcoffset(None) == timedelta(hours=-2) + assert tz2.dst(None) is None + assert tz2.fromutc(dt2) == datetime(2000, 12, 15, 13, 16, 17, tzinfo=tz2) + + +def test_date(): + from datetime import date, timedelta + + d = date(2000, 12, 15) + + assert d.min == date(1, 1, 1) + assert d.max == date(9999, 12, 31) + assert d.resolution == timedelta(1) + + assert date.fromtimestamp(2048) == date(1970, 1, 1) + assert isinstance(date.today(), date) + assert date.fromordinal(2048) == date(6, 8, 10) + + assert d.year == 2000 + assert d.month == 12 + assert d.day == 15 + + assert d.ctime() == "Fri Dec 15 00:00:00 2000" + assert d.strftime("%d") == "15" + assert format(d, "%d") == "15" + assert d.isoformat() == "2000-12-15" + assert [d.timetuple()[i] for i in range(3)] == [2000, 12, 15] + assert d.toordinal() == 730469 + + assert d.replace() == date(2000, 12, 15) + assert d.replace(2001) == date(2001, d.month, d.day) + assert d.replace(2001, 11) == date(2001, 11, d.day) + assert d.replace(2001, 11, 16) == date(2001, 11, 16) + + assert d < date(2000, 12, 16) + assert d <= date(2000, 12, 15) + assert d > date(2000, 12, 14) + assert d >= date(2000, 12, 15) + + assert d + timedelta(3) == date(2000, 12, 18) + assert d - timedelta(3) == date(2000, 12, 12) + assert d - date(2000, 6, 8) == timedelta(190) + + assert d.weekday() == 4 + assert d.isoweekday() == 5 + assert d.isocalendar() == (2000, 50, 5) + + +def test_time(): + from datetime import time, timedelta + + time() + time(23) + + t1 = time(23, 25) + t = time(23, 25, 30) + t2 = time(23, 25, 30, 50) + + assert t.min == time() + assert t.max == time(23, 59, 59, 999999) + assert t.resolution == timedelta(microseconds=1) + + assert t.hour == 23 + assert t.minute == 25 + assert t.second == 30 + assert t.microsecond == 0 + assert t.tzinfo is None + + assert t < t2 + assert t <= time(23, 25, 30) + assert t > t1 + assert t >= time(23, 25, 30) + + assert t.isoformat() == "23:25:30" + assert t.strftime("%m") == "01" + assert format(t, "%m") == "01" + + assert t.utcoffset() is None + assert t.tzname() is None + assert t.dst() is None + + assert t.replace(22) == time(22, t.minute, t.second) + assert t.replace(22, 24) == time(22, 24, t.second) + assert t.replace(22, 24, 29) == time(22, 24, 29) + + from datetime import timezone + + t3 = time(23, 25, 20, tzinfo=None) + assert t3.tzinfo is None + t4 = t3.replace(tzinfo=timezone(timedelta(hours=2))) + assert t4.tzinfo == timezone(timedelta(hours=2)) + + t5 = time(23, 25, 20, tzinfo=timezone(timedelta(hours=2))) + assert t5.tzinfo == timezone(timedelta(hours=2)) + t6 = t5.replace(tzinfo=None) + assert t6.tzinfo is None + + +def test_timedelta(): + from datetime import timedelta + + timedelta() + timedelta(5) + timedelta(5, 6) + timedelta(5, 6, 7) + timedelta(5, 6, 7, 8) + timedelta(5, 6, 7, 8, 9) + timedelta(5, 6, 7, 8, 9, 10) + timedelta(5, 6, 7, 8, 9, 10, 11) + + td1 = timedelta(hours=1, minutes=10, seconds=10) + td = timedelta(hours=1, minutes=10, seconds=20) + td2 = timedelta(hours=1, minutes=10, seconds=30) + + assert td.min == timedelta(days=-999999999) + assert td.max == timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999) + assert td.resolution == timedelta(microseconds=1) + + assert td.days == 0 + assert td.seconds == 4220 + assert td.microseconds == 0 + + assert td.total_seconds() == 4220 + + assert td + td1 == timedelta(hours=2, minutes=20, seconds=30) + assert td2 - td == timedelta(seconds=10) + + assert -td == timedelta(days=-1, hours=22, minutes=49, seconds=40) + assert +td == td + + assert abs(td) == td + + assert td.__mul__(2) == timedelta(hours=2, minutes=20, seconds=40) + assert td.__rmul__(2) == timedelta(hours=2, minutes=20, seconds=40) + + assert td.__floordiv__(2) == timedelta(minutes=35, seconds=10) + assert td.__floordiv__(timedelta(minutes=5)) == 14 + + assert td.__truediv__(2) == timedelta(minutes=35, seconds=10) + td_result = td.__truediv__(timedelta(minutes=5)) + assert 14.0 < td_result + assert td_result < 14.1 + + assert td.__mod__(timedelta(minutes=5)) == timedelta(seconds=20) + assert td.__divmod__(timedelta(minutes=5)) == (14, timedelta(seconds=20)) + + assert td < td2 + assert td <= timedelta(hours=1, minutes=10, seconds=20) + assert td > td1 + assert td >= timedelta(hours=1, minutes=10, seconds=20) + + +def test_datetime(): + from datetime import datetime, timedelta, date, time + + datetime(2000, 12, 25) + datetime(2000, 12, 25, 23) + datetime(2000, 12, 25, 23, 59) + datetime(2000, 12, 25, 23, 59, 59) + datetime(2000, 12, 25, 23, 59, 59, 60) + dt1 = datetime(2000, 12, 24, 23, 59, 59) + dt = datetime(2000, 12, 25, 23, 59, 59) + dt2 = datetime(2000, 12, 26, 23, 59, 59) + + assert dt.min == datetime(1, 1, 1) + assert dt.max == datetime(9999, 12, 31, 23, 59, 59, 999999) + assert dt.resolution == timedelta(microseconds=1) + + assert dt.year == 2000 + assert dt.month == 12 + assert dt.day == 25 + assert dt.hour == 23 + assert dt.minute == 59 + assert dt.second == 59 + assert dt.microsecond == 0 + assert dt.tzinfo is None + + assert datetime.utcfromtimestamp(2048) == datetime(1970, 1, 1, 0, 34, 8) + assert isinstance(datetime.today(), datetime) + assert datetime.fromordinal(2048) == datetime(6, 8, 10) + assert isinstance(datetime.utcnow(), datetime) + assert datetime.combine(date(2000, 12, 25), time(23, 59, 59)) == dt + assert datetime.strptime("2000 12 25 23 59 59", "%Y %m %d %H %M %S") == dt + + assert dt.strftime("%Y %m %d %H %M %S") == "2000 12 25 23 59 59" + assert format(dt, "%Y %m %d %H %M %S") == "2000 12 25 23 59 59" + + assert dt.toordinal() == 730479 + assert [dt.timetuple()[i] for i in range(6)] == [2000, 12, 25, 23, 59, 59] + assert dt.timestamp() == 977777999.0 + assert [dt.utctimetuple()[i] for i in range(6)] == [2000, 12, 25, 23, 59, 59] + assert dt.date() == date(2000, 12, 25) + assert dt.time() == time(23, 59, 59) + assert dt.timetz() == time(23, 59, 59) + assert dt.ctime() == "Mon Dec 25 23:59:59 2000" + assert dt.isoformat() == "2000-12-25T23:59:59" + assert dt.utcoffset() is None + assert dt.tzname() is None + assert dt.dst() is None + assert dt.weekday() == 0 + assert dt.isoweekday() == 1 + assert dt.isocalendar() == (2000, 52, 1) + + assert dt.replace(2001) == datetime(2001, dt.month, dt.day, dt.hour, dt.minute, dt.second) + assert dt.replace(2001, 11) == datetime(2001, 11, dt.day, dt.hour, dt.minute, dt.second) + assert dt.replace(2001, 11, 24) == datetime(2001, 11, 24, dt.hour, dt.minute, dt.second) + assert dt.replace(2001, 11, 24, 22) == datetime(2001, 11, 24, 22, dt.minute, dt.second) + assert dt.replace(2001, 11, 24, 22, 58) == datetime(2001, 11, 24, 22, 58, dt.second) + assert dt.replace(2001, 11, 24, 22, 58, 58) == datetime(2001, 11, 24, 22, 58, 58) + + assert dt < dt2 + assert dt <= datetime(2000, 12, 25, 23, 59, 59) + assert dt > dt1 + assert dt >= datetime(2000, 12, 25, 23, 59, 59) + + assert dt + timedelta(3) == datetime(2000, 12, 28, 23, 59, 59) + assert dt - timedelta(3) == datetime(2000, 12, 22, 23, 59, 59) + assert dt - dt1 == timedelta(1) + + from datetime import timezone + + assert datetime.fromtimestamp(2048, timezone(timedelta(hours=2))) == datetime(1970, 1, 1, 2, 34, 8, tzinfo=timezone(timedelta(hours=2))) + assert datetime.fromtimestamp(2048, None) == datetime(1970, 1, 1, 3, 34, 8) + assert datetime.fromtimestamp(2048) == datetime(1970, 1, 1, 3, 34, 8) + + assert isinstance(datetime.now(timezone(timedelta(hours=2))), datetime) + assert isinstance(datetime.now(None), datetime) + assert isinstance(datetime.now(), datetime) + + dt3 = datetime(2000, 12, 25, 15, 16, 17, tzinfo=timezone(timedelta(hours=2))) + assert dt3.tzinfo == timezone(timedelta(hours=2)) + + assert dt3.astimezone(timezone(timedelta(hours=-2))) == datetime(2000, 12, 25, 11, 16, 17, tzinfo=timezone(timedelta(hours=-2))) + assert isinstance(dt3.astimezone(None), datetime) + assert isinstance(dt3.astimezone(), datetime) + + dt4 = dt3.replace(tzinfo=None) + assert dt4.tzinfo is None + + dt5 = datetime(2000, 12, 25, 15, 16, 17, tzinfo=None) + assert dt5.tzinfo is None + + import sys + if sys.version_info >= (3, 6): + assert dt5.astimezone(timezone(timedelta(hours=-2))) == datetime(2000, 12, 25, 10, 16, 17, tzinfo=timezone(timedelta(hours=-2))) + assert isinstance(dt5.astimezone(None), datetime) + assert isinstance(dt5.astimezone(), datetime) + + dt6 = dt5.replace(tzinfo=timezone(timedelta(hours=2))) + assert dt6.tzinfo == timezone(timedelta(hours=2)) \ No newline at end of file