@@ -561,6 +561,16 @@ def test_tzset(self):
561561 del environ ['TZ' ]
562562 time .tzset ()
563563
564+ @unittest .skipUnless (sysconfig .get_config_var ('_Py_HAVE_TIMEZONE_GLOBALS' ),
565+ 'requires libc timezone globals' )
566+ @support .run_with_tz ('IST-1GMT0,M10.5.0,M3.5.0/1' )
567+ def test_tzset_negative_dst (self ):
568+ # Prefer libc's standard/DST classification over ordering offsets.
569+ # altzone may still assume a one-hour positive DST shift.
570+ self .assertEqual (time .timezone , - 3600 )
571+ self .assertEqual (time .tzname , ('IST' , 'GMT' ))
572+ self .assertEqual (time .daylight , 1 )
573+
564574 def test_insane_timestamps (self ):
565575 # It's possible that some platform maps time_t to double,
566576 # and that this test will fail there. This test should
@@ -858,17 +868,10 @@ def test_localtime_timezone(self):
858868 lt = time .localtime ()
859869 self .assertHasAttr (lt , "tm_gmtoff" )
860870 self .assertHasAttr (lt , "tm_zone" )
861-
862- # See if the offset and zone are similar to the module
863- # attributes.
864871 if lt .tm_gmtoff is None :
865872 self .assertNotHasAttr (time , "timezone" )
866- else :
867- self .assertEqual (lt .tm_gmtoff , - [time .timezone , time .altzone ][lt .tm_isdst ])
868873 if lt .tm_zone is None :
869874 self .assertNotHasAttr (time , "tzname" )
870- else :
871- self .assertEqual (lt .tm_zone , time .tzname [lt .tm_isdst ])
872875
873876 # Try and make UNIX times from the localtime and a 9-tuple
874877 # created from the localtime. Test to see that the times are
@@ -886,6 +889,21 @@ def test_localtime_timezone(self):
886889 self .assertEqual (new_lt .tm_gmtoff , lt .tm_gmtoff )
887890 self .assertEqual (new_lt9 .tm_zone , lt .tm_zone )
888891
892+ @support .run_with_tz ('EST5EDT,M3.2.0,M11.1.0' )
893+ @skip_if_buggy_ucrt_strfptime
894+ def test_localtime_timezone_constants (self ):
895+ # The module constants cannot describe every historical or current
896+ # offset in zones whose rules have changed. Compare them against
897+ # localtime() using explicit rules with a one-hour DST shift.
898+ for month , isdst in ((1 , 0 ), (7 , 1 )):
899+ with self .subTest (month = month ):
900+ t = time .mktime ((2000 , month , 1 , 12 , 0 , 0 , 0 , 0 , - 1 ))
901+ lt = time .localtime (t )
902+ self .assertEqual (lt .tm_isdst , isdst )
903+ self .assertEqual (lt .tm_gmtoff ,
904+ - (time .timezone , time .altzone )[isdst ])
905+ self .assertEqual (lt .tm_zone , time .tzname [isdst ])
906+
889907 def test_strptime_timezone (self ):
890908 t = time .strptime ("UTC" , "%Z" )
891909 self .assertEqual (t .tm_zone , 'UTC' )
0 commit comments