Skip to content

Commit b341b81

Browse files
gh-115810: Expose the name attribute of datetime.timezone (#131210)
1 parent 897671b commit b341b81

6 files changed

Lines changed: 44 additions & 1 deletion

File tree

‎Doc/library/datetime.rst‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2476,6 +2476,11 @@ where historical changes have been made to civil time.
24762476
Return ``dt + offset``. The *dt* argument must be an aware
24772477
:class:`.datetime` instance, with ``tzinfo`` set to ``self``.
24782478

2479+
.. attribute:: timezone.name
2480+
2481+
The *name* passed to the constructor, or ``None`` if no name was passed.
2482+
2483+
.. versionadded:: next
24792484

24802485
Class attributes:
24812486

‎Doc/whatsnew/3.16.rst‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,10 @@ datetime
392392
:meth:`datetime.time.strptime`.
393393
(Contributed by Stan Ulbrych and Karoline Pauls in :gh:`157290`.)
394394

395+
* Add :attr:`datetime.timezone.name`, the *name* passed to the constructor,
396+
or ``None`` if no name was passed.
397+
(Contributed by Stan Ulbrych in :gh:`131210`.)
398+
395399

396400
dbm.gnu
397401
-------

‎Lib/_pydatetime.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2539,6 +2539,11 @@ def tzname(self, dt):
25392539
raise TypeError("tzname() argument must be a datetime instance"
25402540
" or None")
25412541

2542+
@property
2543+
def name(self):
2544+
"""Name given when the timezone was created."""
2545+
return self._name
2546+
25422547
def dst(self, dt):
25432548
if isinstance(dt, datetime) or dt is None:
25442549
return None

‎Lib/test/datetimetester.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,17 @@ def test_tzname(self):
354354
with self.assertRaises(TypeError): self.EST.tzname('')
355355
with self.assertRaises(TypeError): self.EST.tzname(5)
356356

357+
def test_name(self):
358+
for offset, name in ((5 * HOUR, 'IST'), (ZERO, '\ud800')):
359+
with self.subTest(offset=offset, name=name):
360+
self.assertEqual(name, timezone(offset, name).name)
361+
362+
for tz in (UTC, timezone(ZERO), timezone(-5 * HOUR)):
363+
with self.subTest(tz=tz):
364+
self.assertIsNone(tz.name)
365+
366+
with self.assertRaises(AttributeError): self.EST.name = 'EST'
367+
357368
def test_fromutc(self):
358369
with self.assertRaises(ValueError):
359370
timezone.utc.fromutc(self.DT)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Add :attr:`datetime.timezone.name`, the *name* passed to the constructor,
2+
or ``None`` if no name was passed.

‎Modules/_datetimemodule.c‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4558,6 +4558,22 @@ static PyMethodDef timezone_methods[] = {
45584558
{NULL, NULL}
45594559
};
45604560

4561+
static PyObject *
4562+
timezone_name(PyObject *op, void *Py_UNUSED(closure))
4563+
{
4564+
PyDateTime_TimeZone *self = PyTimeZone_CAST(op);
4565+
if (self->name == NULL) {
4566+
Py_RETURN_NONE;
4567+
}
4568+
return Py_NewRef(self->name);
4569+
}
4570+
4571+
static PyGetSetDef timezone_getset[] = {
4572+
{"name", timezone_name, NULL,
4573+
PyDoc_STR("Name given when the timezone was created.")},
4574+
{NULL}
4575+
};
4576+
45614577
static PyTypeObject PyDateTime_TimeZoneType = {
45624578
PyVarObject_HEAD_INIT(NULL, 0)
45634579
"datetime.timezone", /* tp_name */
@@ -4588,7 +4604,7 @@ static PyTypeObject PyDateTime_TimeZoneType = {
45884604
0, /* tp_iternext */
45894605
timezone_methods, /* tp_methods */
45904606
0, /* tp_members */
4591-
0, /* tp_getset */
4607+
timezone_getset, /* tp_getset */
45924608
&PyDateTime_TZInfoType, /* tp_base */
45934609
0, /* tp_dict */
45944610
0, /* tp_descr_get */

0 commit comments

Comments
 (0)