From efc5790e0b3390cd25155420bf047346018856a8 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Thu, 13 Mar 2025 20:24:35 +0000 Subject: [PATCH] Inital --- Doc/library/datetime.rst | 4 ++++ Lib/_pydatetime.py | 7 +++++++ Lib/test/datetimetester.py | 7 +++++++ ...03-13-20-21-00.gh-issue-115810.qwrb231.rst | 2 ++ Modules/_datetimemodule.c | 19 ++++++++++++++++++- 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-03-13-20-21-00.gh-issue-115810.qwrb231.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 1af7d6be750102..83417b98223d9a 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -2421,6 +2421,10 @@ Class attributes: The UTC time zone, ``timezone(timedelta(0))``. +.. attribute:: timezone.name + + The name of the timezone if specified during creation. If no name is provided, + an empty string is returned. .. index:: single: % (percent); datetime format diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index 26bcd1e491d78c..c3bc24c522064a 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -2486,6 +2486,13 @@ def tzname(self, dt): raise TypeError("tzname() argument must be a datetime instance" " or None") + @property + def name(self): + """Return provided name otherwise empty string.""" + if not self._name: + return '' + return self._name + def dst(self, dt): if isinstance(dt, datetime) or dt is None: return None diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 84eb872f964ba1..7bd424662bb9d6 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -348,6 +348,13 @@ def test_tzname(self): with self.assertRaises(TypeError): self.EST.tzname('') with self.assertRaises(TypeError): self.EST.tzname(5) + def test_name_property(self): + tz_named = timezone(timedelta(hours=5), 'IST') + self.assertEqual(tz_named.name, 'IST') + + tz_unnamed = timezone(timedelta(hours=0)) + self.assertEqual(tz_unnamed.name, '') + def test_fromutc(self): with self.assertRaises(ValueError): timezone.utc.fromutc(self.DT) diff --git a/Misc/NEWS.d/next/Library/2025-03-13-20-21-00.gh-issue-115810.qwrb231.rst b/Misc/NEWS.d/next/Library/2025-03-13-20-21-00.gh-issue-115810.qwrb231.rst new file mode 100644 index 00000000000000..a5a0676b69e9bb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-03-13-20-21-00.gh-issue-115810.qwrb231.rst @@ -0,0 +1,2 @@ +Add ``name`` attribute to :class:`datetime.timezone` that returns the ``name`` +provided during creation else an empty string. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 83b92fe606984c..8aff498aebef74 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4373,6 +4373,16 @@ timezone_tzname(PyObject *op, PyObject *dt) return timezone_str(op); } +static PyObject * +timezone_name(PyDateTime_TimeZone *self, void *closure) +{ + if (self->name == NULL) { + return PyUnicode_FromString(""); + } + Py_INCREF(self->name); + return self->name; +} + static PyObject * timezone_utcoffset(PyObject *op, PyObject *dt) { @@ -4440,6 +4450,13 @@ static PyMethodDef timezone_methods[] = { {NULL, NULL} }; +static PyGetSetDef timezone_getset[] = { + {"name", (getter)timezone_name, NULL, + PyDoc_STR("If name is specified when timezone is created, returns the name."), NULL}, + {NULL} +}; + + static const char timezone_doc[] = PyDoc_STR("Fixed offset from UTC implementation of tzinfo."); @@ -4473,7 +4490,7 @@ static PyTypeObject PyDateTime_TimeZoneType = { 0, /* tp_iternext */ timezone_methods, /* tp_methods */ 0, /* tp_members */ - 0, /* tp_getset */ + timezone_getset, /* tp_getset */ 0, /* tp_base; filled in PyInit__datetime */ 0, /* tp_dict */ 0, /* tp_descr_get */