From 780c2408df19a8e345ccf243fc8977928656dd21 Mon Sep 17 00:00:00 2001 From: Frazer McLean Date: Tue, 11 Nov 2025 18:50:55 +0100 Subject: [PATCH] DateTime.combine should default to time.tzinfo --- src/datetype/__init__.py | 6 +++++- src/datetype/test/test_datetype.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/datetype/__init__.py b/src/datetype/__init__.py index 8a9c680..c56063b 100644 --- a/src/datetype/__init__.py +++ b/src/datetype/__init__.py @@ -39,6 +39,8 @@ AnyDateTime = TypeVar("AnyDateTime", bound="DateTime[Optional[_tzinfo]]") AnyTime = TypeVar("AnyTime", bound="Time[Optional[_tzinfo]]") +_missing = object() + if sys.version_info >= (3, 9): class _IsoCalendarDate(NamedTuple): @@ -513,8 +515,10 @@ def combine( cls, date: Date, time: Time[Optional[_tzinfo]], - tzinfo: Optional[_tzinfo] = None, + tzinfo: Optional[_tzinfo] = _missing, # type: ignore[assignment] ) -> DateTime[Optional[_tzinfo]]: + if tzinfo is _missing: + tzinfo = time.tzinfo return _datetime.combine( concrete(date), concrete(time), tzinfo ) # type:ignore[return-value] diff --git a/src/datetype/test/test_datetype.py b/src/datetype/test/test_datetype.py index 6d42cbd..1a73dd5 100644 --- a/src/datetype/test/test_datetype.py +++ b/src/datetype/test/test_datetype.py @@ -12,6 +12,7 @@ aware, naive, DateTime, + date_only, ) TEST_DATA = (Path(__file__) / "..").resolve() @@ -109,3 +110,31 @@ def test_differing_zone_subtract(self) -> None: self.assertEqual(dtzi - dttz, timedelta(0)) self.assertEqual(dttz - dtzi, timedelta(0)) + + def test_combine(self) -> None: + from zoneinfo import ZoneInfo + + d = date_only(date(2025, 2, 13)) + aware_time = aware( + time(hour=15, minute=35, second=13, tzinfo=timezone.utc), timezone + ) + naive_time = naive(time(hour=15, minute=35, second=13)) + + combined_aware: DateTime[timezone] = DateTime.combine(d, aware_time) + combined_naive: DateTime[None] = DateTime.combine(d, naive_time) + + self.assertIsInstance(combined_naive, NaiveDateTime) + self.assertIsInstance(combined_aware, AwareDateTime) + self.assertIs(combined_aware.tzinfo, timezone.utc) + + zi = ZoneInfo("Europe/Berlin") + + adt_zi: DateTime[ZoneInfo] = DateTime.combine(d, aware_time, zi) + self.assertIsInstance(adt_zi, AwareDateTime) + adt_naive: DateTime[None] = DateTime.combine(d, aware_time, tzinfo=None) + self.assertIsInstance(adt_naive, NaiveDateTime) + + ndt_zi: DateTime[ZoneInfo] = DateTime.combine(d, naive_time, zi) + self.assertIsInstance(ndt_zi, AwareDateTime) + ndt_naive: DateTime[None] = DateTime.combine(d, naive_time, tzinfo=None) + self.assertIsInstance(ndt_naive, NaiveDateTime)