mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
Closes issue bpo-5288: Allow tzinfo objects with sub-minute offsets. (#2896)
* Closes issue bpo-5288: Allow tzinfo objects with sub-minute offsets. * bpo-5288: Implemented %z formatting of sub-minute offsets. * bpo-5288: Removed mentions of the whole minute limitation on TZ offsets. * bpo-5288: Removed one more mention of the whole minute limitation. Thanks @csabella! * Fix a formatting error in the docs * Addressed review comments. Thanks, @haypo.
This commit is contained in:
parent
c6ea8974e2
commit
018d353c1c
5 changed files with 127 additions and 79 deletions
|
@ -255,14 +255,15 @@ class TestTimeZone(unittest.TestCase):
|
|||
self.assertEqual(timezone.min.utcoffset(None), -limit)
|
||||
self.assertEqual(timezone.max.utcoffset(None), limit)
|
||||
|
||||
|
||||
def test_constructor(self):
|
||||
self.assertIs(timezone.utc, timezone(timedelta(0)))
|
||||
self.assertIsNot(timezone.utc, timezone(timedelta(0), 'UTC'))
|
||||
self.assertEqual(timezone.utc, timezone(timedelta(0), 'UTC'))
|
||||
for subminute in [timedelta(microseconds=1), timedelta(seconds=1)]:
|
||||
tz = timezone(subminute)
|
||||
self.assertNotEqual(tz.utcoffset(None) % timedelta(minutes=1), 0)
|
||||
# invalid offsets
|
||||
for invalid in [timedelta(microseconds=1), timedelta(1, 1),
|
||||
timedelta(seconds=1), timedelta(1), -timedelta(1)]:
|
||||
for invalid in [timedelta(1, 1), timedelta(1)]:
|
||||
self.assertRaises(ValueError, timezone, invalid)
|
||||
self.assertRaises(ValueError, timezone, -invalid)
|
||||
|
||||
|
@ -301,6 +302,15 @@ class TestTimeZone(unittest.TestCase):
|
|||
self.assertEqual('UTC-00:01', timezone(timedelta(minutes=-1)).tzname(None))
|
||||
self.assertEqual('XYZ', timezone(-5 * HOUR, 'XYZ').tzname(None))
|
||||
|
||||
# Sub-minute offsets:
|
||||
self.assertEqual('UTC+01:06:40', timezone(timedelta(0, 4000)).tzname(None))
|
||||
self.assertEqual('UTC-01:06:40',
|
||||
timezone(-timedelta(0, 4000)).tzname(None))
|
||||
self.assertEqual('UTC+01:06:40.000001',
|
||||
timezone(timedelta(0, 4000, 1)).tzname(None))
|
||||
self.assertEqual('UTC-01:06:40.000001',
|
||||
timezone(-timedelta(0, 4000, 1)).tzname(None))
|
||||
|
||||
with self.assertRaises(TypeError): self.EST.tzname('')
|
||||
with self.assertRaises(TypeError): self.EST.tzname(5)
|
||||
|
||||
|
@ -2152,6 +2162,9 @@ class TestDateTime(TestDate):
|
|||
t = self.theclass(2004, 12, 31, 6, 22, 33, 47)
|
||||
self.assertEqual(t.strftime("%m %d %y %f %S %M %H %j"),
|
||||
"12 31 04 000047 33 22 06 366")
|
||||
tz = timezone(-timedelta(hours=2, seconds=33, microseconds=123))
|
||||
t = t.replace(tzinfo=tz)
|
||||
self.assertEqual(t.strftime("%z"), "-020033.000123")
|
||||
|
||||
def test_extract(self):
|
||||
dt = self.theclass(2002, 3, 4, 18, 45, 3, 1234)
|
||||
|
@ -2717,8 +2730,8 @@ class TZInfoBase:
|
|||
def utcoffset(self, dt): return timedelta(microseconds=61)
|
||||
def dst(self, dt): return timedelta(microseconds=-81)
|
||||
t = cls(1, 1, 1, tzinfo=C7())
|
||||
self.assertRaises(ValueError, t.utcoffset)
|
||||
self.assertRaises(ValueError, t.dst)
|
||||
self.assertEqual(t.utcoffset(), timedelta(microseconds=61))
|
||||
self.assertEqual(t.dst(), timedelta(microseconds=-81))
|
||||
|
||||
def test_aware_compare(self):
|
||||
cls = self.theclass
|
||||
|
@ -4297,7 +4310,6 @@ class TestLocalTimeDisambiguation(unittest.TestCase):
|
|||
self.assertEqual(gdt.strftime("%c %Z"),
|
||||
'Mon Jun 23 22:00:00 1941 UTC')
|
||||
|
||||
|
||||
def test_constructors(self):
|
||||
t = time(0, fold=1)
|
||||
dt = datetime(1, 1, 1, fold=1)
|
||||
|
@ -4372,7 +4384,6 @@ class TestLocalTimeDisambiguation(unittest.TestCase):
|
|||
self.assertEqual(t0.fold, 0)
|
||||
self.assertEqual(t1.fold, 1)
|
||||
|
||||
|
||||
@support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
|
||||
def test_timestamp(self):
|
||||
dt0 = datetime(2014, 11, 2, 1, 30)
|
||||
|
@ -4390,7 +4401,6 @@ class TestLocalTimeDisambiguation(unittest.TestCase):
|
|||
s1 = t.replace(fold=1).timestamp()
|
||||
self.assertEqual(s0 + 1800, s1)
|
||||
|
||||
|
||||
@support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
|
||||
def test_astimezone(self):
|
||||
dt0 = datetime(2014, 11, 2, 1, 30)
|
||||
|
@ -4406,7 +4416,6 @@ class TestLocalTimeDisambiguation(unittest.TestCase):
|
|||
self.assertEqual(adt0.fold, 0)
|
||||
self.assertEqual(adt1.fold, 0)
|
||||
|
||||
|
||||
def test_pickle_fold(self):
|
||||
t = time(fold=1)
|
||||
dt = datetime(1, 1, 1, fold=1)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue