@@ -42,7 +42,7 @@ def datetime(
4242 raise NotImplementedError
4343
4444
45- class Timezone (zoneinfo .ZoneInfo , PendulumTimezone ): # type: ignore[misc]
45+ class Timezone (zoneinfo .ZoneInfo , PendulumTimezone ):
4646 """
4747 Represents a named timezone.
4848
@@ -54,13 +54,13 @@ class Timezone(zoneinfo.ZoneInfo, PendulumTimezone): # type: ignore[misc]
5454
5555 def __new__ (cls , key : str ) -> Timezone :
5656 try :
57- return cast ( Timezone , super ().__new__ (cls , key ))
57+ return super ().__new__ (cls , key ) # type: ignore[call-arg]
5858 except zoneinfo .ZoneInfoNotFoundError :
5959 raise InvalidTimezone (key )
6060
6161 @property
6262 def name (self ) -> str :
63- return cast ( str , self .key )
63+ return self .key
6464
6565 def convert (
6666 self , dt : datetime_ .datetime , raise_on_unknown_times : bool = False
@@ -86,11 +86,24 @@ def convert(
8686 '2013-03-30T21:30:00-04:00'
8787 """
8888 if dt .tzinfo is None :
89- offset_before = (
90- self .utcoffset (dt .replace (fold = 0 )) if dt .fold else self .utcoffset (dt )
89+ # Technically, utcoffset() can return None, but none of the zone information
90+ # in tzdata sets _tti_before to None. This can be checked with the following
91+ # code:
92+ #
93+ # >>> import zoneinfo
94+ # >>> from zoneinfo._zoneinfo import ZoneInfo
95+ #
96+ # >>> for tzname in zoneinfo.available_timezones():
97+ # >>> if ZoneInfo(tzname)._tti_before is None:
98+ # >>> print(tzname)
99+
100+ offset_before = cast (
101+ datetime_ .timedelta ,
102+ (self .utcoffset (dt .replace (fold = 0 )) if dt .fold else self .utcoffset (dt )),
91103 )
92- offset_after = (
93- self .utcoffset (dt ) if dt .fold else self .utcoffset (dt .replace (fold = 1 ))
104+ offset_after = cast (
105+ datetime_ .timedelta ,
106+ (self .utcoffset (dt ) if dt .fold else self .utcoffset (dt .replace (fold = 1 ))),
94107 )
95108
96109 if offset_after > offset_before :
0 commit comments