1
1
"""Test the datetime module."""
2
2
import bisect
3
+ import contextlib
3
4
import copy
4
5
import decimal
5
6
import io
20
21
21
22
from test import support
22
23
from test .support import is_resource_enabled , ALWAYS_EQ , LARGEST , SMALLE
8000
ST
23
- from test .support import script_helper , warnings_helper
24
+ from test .support import os_helper , script_helper , warnings_helper
24
25
25
26
import datetime as datetime_module
26
27
from datetime import MINYEAR , MAXYEAR
@@ -6691,6 +6692,17 @@ def test_gaps(self):
6691
6692
ldt = tz .fromutc (udt .replace (tzinfo = tz ))
6692
6693
self .assertEqual (ldt .fold , 0 )
6693
6694
6695
+ @classmethod
6696
+ @contextlib .contextmanager
6697
+ def _change_tz (cls , new_tzinfo ):
6698
+ try :
6699
+ with os_helper .EnvironmentVarGuard () as env :
6700
+ env ["TZ" ] = new_tzinfo
6701
+ _time .tzset ()
6702
+ yield
6703
+ finally :
6704
+ _time .tzset ()
6705
+
6694
6706
@unittest .skipUnless (
6695
6707
hasattr (_time , "tzset" ), "time module has no attribute tzset"
6696
6708
)
@@ -6705,18 +6717,15 @@ def test_system_transitions(self):
6705
6717
self .zonename .startswith ('right/' )):
6706
6718
self .skipTest ("Skipping %s" % self .zonename )
6707
6719
tz = self .tz
6708
- TZ = os .environ .get ('TZ' )
6709
- os .environ ['TZ' ] = self .zonename
6710
- try :
6711
- _time .tzset ()
6720
+ with self ._change_tz (self .zonename ):
6712
6721
for udt , shift in tz .transitions ():
6713
6722
if udt .year >= 2037 :
6714
6723
# System support for times around the end of 32-bit time_t
6715
6724
# and later is flaky on many systems.
6716
6725
break
6717
6726
s0 = (udt - datetime (1970 , 1 , 1 )) // SEC
6718
6727
ss = shift // SEC # shift seconds
6719
- for x in [- 40 * 3600 , - 20 * 3600 , - 1 , 0 ,
6728
+ for x in [- 40 * 3600 , - 20 * 3600 , - 1 , 0 ,
6720
6729
ss - 1 , ss + 20 * 3600 , ss + 40 * 3600 ]:
6721
6730
s = s0 + x
6722
6731
sdt = datetime .fromtimestamp (s )
@@ -6735,12 +6744,6 @@ def test_system_transitions(self):
6735
6744
utc0 = dt .astimezone (timezone .utc )
6736
6745
utc1 = dt .replace (fold = 1 ).astimezone (timezone .utc )
6737
6746
self .assertEqual (utc0 , utc1 + timedelta (0 , ss ))
6738
- finally :
6739
- if TZ is None :
6740
- del os .environ ['TZ' ]
6741
- else :
6742
- os .environ ['TZ' ] = TZ
6743
- _time .tzset ()
6744
6747
6745
6748
6746
6749
class ZoneInfoCompleteTest (unittest .TestSuite ):
0 commit comments