Index: Lib/test/test_datetime.py =================================================================== --- Lib/test/test_datetime.py (revision 82614) +++ Lib/test/test_datetime.py (working copy) @@ -161,7 +161,9 @@ def test_constructor(self): - self.assertEqual(timezone.utc, timezone(timedelta(0))) + self.assertIs(timezone.utc, timezone(timedelta(0))) + self.assertIsNot(timezone.utc, timezone(timedelta(0), 'UTC')) + self.assertEqual(timezone.utc, timezone(timedelta(0), 'UTC')) # invalid offsets for invalid in [timedelta(microseconds=1), timedelta(1, 1), timedelta(seconds=1), timedelta(1), -timedelta(1)]: Index: Modules/datetimemodule.c =================================================================== --- Modules/datetimemodule.c (revision 82614) +++ Modules/datetimemodule.c (working copy) @@ -780,12 +780,15 @@ PyObject *name; } PyDateTime_TimeZone; +/* The interned UTC timezone instance */ +static PyObject *PyDateTime_TimeZone_UTC; + /* Create new timezone instance checking offset range. This function does not check the name argument. Caller must assure that offset is a timedelta instance and name is either NULL or a unicode object. */ static PyObject * -new_timezone(PyObject *offset, PyObject *name) +create_timezone(PyObject *offset, PyObject *name) { PyDateTime_TimeZone *self; PyTypeObject *type = &PyDateTime_TimeZoneType; @@ -818,6 +821,22 @@ return (PyObject *)self; } +static int delta_bool(PyDateTime_Delta *self); + +static PyObject * +new_timezone(PyObject *offset, PyObject *name) +{ + assert(offset != NULL); + assert(PyDelta_Check(offset)); + assert(name == NULL || PyUnicode_Check(name)); + + if (name == NULL && delta_bool((PyDateTime_Delta *)offset) == 0) { + Py_INCREF(PyDateTime_TimeZone_UTC); + return PyDateTime_TimeZone_UTC; + } + return create_timezone(offset, name); +} + /* --------------------------------------------------------------------------- * tzinfo helpers. */ @@ -5256,11 +5275,11 @@ delta = new_delta(0, 0, 0, 0); if (delta == NULL) return NULL; - x = new_timezone(delta, NULL); + x = create_timezone(delta, NULL); Py_DECREF(delta); if (x == NULL || PyDict_SetItemString(d, "utc", x) < 0) return NULL; - Py_DECREF(x); + PyDateTime_TimeZone_UTC = x; delta = new_delta(-1, 60, 0, 1); /* -23:59 */ if (delta == NULL)