cpython: a96101dd105c (original) (raw)

--- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -83,6 +83,10 @@ An explanation of some terminology and c and :attr:tm_zone attributes when platform supports corresponding struct tm members.

+

- .. function:: time() Return the time in seconds since the epoch as a floating point number.

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -143,6 +143,10 @@ Core and Builtins Library ------- +- Issue #25283: Attributes tm_gmtoff and tm_zone are now available on

--- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -250,10 +250,8 @@ static PyStructSequence_Field struct_tim {"tm_wday", "day of week, range [0, 6], Monday is 0"}, {"tm_yday", "day of year, range [1, 366]"}, {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"}, -#ifdef HAVE_STRUCT_TM_TM_ZONE {"tm_zone", "abbreviation of timezone name"}, {"tm_gmtoff", "offset from UTC in seconds"}, -#endif /* HAVE_STRUCT_TM_TM_ZONE */ {0} }; @@ -275,7 +273,11 @@ static PyTypeObject StructTimeType; static PyObject * -tmtotuple(struct tm *p) +tmtotuple(struct tm *p +#ifndef HAVE_STRUCT_TM_TM_ZONE

+#endif +) { PyObject *v = PyStructSequence_New(&StructTimeType); if (v == NULL) @@ -296,6 +298,10 @@ tmtotuple(struct tm *p) PyStructSequence_SET_ITEM(v, 9, PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape")); SET(10, p->tm_gmtoff); +#else

#endif /* HAVE_STRUCT_TM_TM_ZONE */ #undef SET if (PyErr_Occurred()) { @@ -348,9 +354,26 @@ time_gmtime(PyObject *self, PyObject *ar return PyErr_SetFromErrno(PyExc_OSError); } buf = *local; +#ifdef HAVE_STRUCT_TM_TM_ZONE return tmtotuple(&buf); +#else

+#endif } +#ifndef HAVE_TIMEGM +static time_t +timegm(struct tm *p) +{

+} +#endif + PyDoc_STRVAR(gmtime_doc, "gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n[](#l3.63) tm_sec, tm_wday, tm_yday, tm_isdst)\n[](#l3.64) @@ -391,7 +414,18 @@ time_localtime(PyObject *self, PyObject return NULL; if (pylocaltime(&when, &buf) == -1) return NULL; +#ifdef HAVE_STRUCT_TM_TM_ZONE return tmtotuple(&buf); +#else

+#endif } PyDoc_STRVAR(localtime_doc, @@ -1146,6 +1180,27 @@ PyDoc_STRVAR(get_clock_info_doc, Get information of the specified clock."); static void +get_zone(char *zone, int n, struct tm *p) +{ +#ifdef HAVE_STRUCT_TM_TM_ZONE

+#else

+#endif +} + +static int +get_gmtoff(time_t t, struct tm *p) +{ +#ifdef HAVE_STRUCT_TM_TM_ZONE

+#else

+#endif +} + +static void PyInit_timezone(PyObject m) { / This code moved from PyInit_time wholesale to allow calling it from time_tzset. In the future, some parts of it can be moved back @@ -1177,7 +1232,6 @@ PyInit_timezone(PyObject m) { otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape"); PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1)); #else / !HAVE_TZNAME || GLIBC || CYGWIN*/ -#ifdef HAVE_STRUCT_TM_TM_ZONE { #define YEAR ((time_t)((365 * 24 + 6) * 3600)) time_t t; @@ -1186,13 +1240,13 @@ PyInit_timezone(PyObject *m) { char janname[10], julyname[10]; t = (time((time_t *)0) / YEAR) * YEAR; p = localtime(&t);

if( janzone < julyzone ) { @@ -1214,8 +1268,6 @@ PyInit_timezone(PyObject m) { janname, julyname)); } } -#else -#endif / HAVE_STRUCT_TM_TM_ZONE / #ifdef CYGWIN tzset(); PyModule_AddIntConstant(m, "timezone", _timezone); @@ -1225,25 +1277,6 @@ PyInit_timezone(PyObject m) { Py_BuildValue("(zz)", _tzname[0], _tzname[1])); #endif / CYGWIN / #endif / !HAVE_TZNAME || GLIBC || CYGWIN/ - -#if defined(HAVE_CLOCK_GETTIME)

-#ifdef CLOCK_MONOTONIC

-#endif -#ifdef CLOCK_MONOTONIC_RAW

-#endif -#ifdef CLOCK_HIGHRES

-#endif -#ifdef CLOCK_PROCESS_CPUTIME_ID

-#endif -#ifdef CLOCK_THREAD_CPUTIME_ID

-#endif -#endif /* HAVE_CLOCK_GETTIME / } @@ -1350,17 +1383,32 @@ PyInit_time(void) / Set, or reset, module variables like time.timezone */ PyInit_timezone(m); +#if defined(HAVE_CLOCK_GETTIME)

+#ifdef CLOCK_MONOTONIC

+#endif +#ifdef CLOCK_MONOTONIC_RAW

+#endif +#ifdef CLOCK_HIGHRES

+#endif +#ifdef CLOCK_PROCESS_CPUTIME_ID

+#endif +#ifdef CLOCK_THREAD_CPUTIME_ID

+#endif +#endif /* HAVE_CLOCK_GETTIME */ + if (!initialized) { if (PyStructSequence_InitType2(&StructTimeType, &struct_time_type_desc) < 0) return NULL; } Py_INCREF(&StructTimeType); -#ifdef HAVE_STRUCT_TM_TM_ZONE PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11); -#else

-#endif PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); initialized = 1; return m;