Skip to content

Commit 1dcafd5

Browse files
authored
Merge pull request #20 from RazerM/fix/datetime-combine
DateTime.combine should default to time.tzinfo
2 parents cd42459 + 780c240 commit 1dcafd5

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

src/datetype/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
AnyDateTime = TypeVar("AnyDateTime", bound="DateTime[Optional[_tzinfo]]")
4040
AnyTime = TypeVar("AnyTime", bound="Time[Optional[_tzinfo]]")
4141

42+
_missing = object()
43+
4244
if sys.version_info >= (3, 9):
4345

4446
class _IsoCalendarDate(NamedTuple):
@@ -513,8 +515,10 @@ def combine(
513515
cls,
514516
date: Date,
515517
time: Time[Optional[_tzinfo]],
516-
tzinfo: Optional[_tzinfo] = None,
518+
tzinfo: Optional[_tzinfo] = _missing, # type: ignore[assignment]
517519
) -> DateTime[Optional[_tzinfo]]:
520+
if tzinfo is _missing:
521+
tzinfo = time.tzinfo
518522
return _datetime.combine(
519523
concrete(date), concrete(time), tzinfo
520524
) # type:ignore[return-value]

src/datetype/test/test_datetype.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
aware,
1313
naive,
1414
DateTime,
15+
date_only,
1516
)
1617

1718
TEST_DATA = (Path(__file__) / "..").resolve()
@@ -109,3 +110,31 @@ def test_differing_zone_subtract(self) -> None:
109110

110111
self.assertEqual(dtzi - dttz, timedelta(0))
111112
self.assertEqual(dttz - dtzi, timedelta(0))
113+
114+
def test_combine(self) -> None:
115+
from zoneinfo import ZoneInfo
116+
117+
d = date_only(date(2025, 2, 13))
118+
aware_time = aware(
119+
time(hour=15, minute=35, second=13, tzinfo=timezone.utc), timezone
120+
)
121+
naive_time = naive(time(hour=15, minute=35, second=13))
122+
123+
combined_aware: DateTime[timezone] = DateTime.combine(d, aware_time)
124+
combined_naive: DateTime[None] = DateTime.combine(d, naive_time)
125+
126+
self.assertIsInstance(combined_naive, NaiveDateTime)
127+
self.assertIsInstance(combined_aware, AwareDateTime)
128+
self.assertIs(combined_aware.tzinfo, timezone.utc)
129+
130+
zi = ZoneInfo("Europe/Berlin")
131+
132+
adt_zi: DateTime[ZoneInfo] = DateTime.combine(d, aware_time, zi)
133+
self.assertIsInstance(adt_zi, AwareDateTime)
134+
adt_naive: DateTime[None] = DateTime.combine(d, aware_time, tzinfo=None)
135+
self.assertIsInstance(adt_naive, NaiveDateTime)
136+
137+
ndt_zi: DateTime[ZoneInfo] = DateTime.combine(d, naive_time, zi)
138+
self.assertIsInstance(ndt_zi, AwareDateTime)
139+
ndt_naive: DateTime[None] = DateTime.combine(d, naive_time, tzinfo=None)
140+
self.assertIsInstance(ndt_naive, NaiveDateTime)

0 commit comments

Comments
 (0)