From b4c7defe58695a6670a8fdeaef67a638bbb47e42 Mon Sep 17 00:00:00 2001 From: Paul Monson Date: Wed, 12 Jun 2019 16:13:27 -0700 Subject: =?UTF-8?q?bpo-36779:=20time.tzname=20returns=20empty=20string=20o?= =?UTF-8?q?n=20Windows=20if=20default=20cod=E2=80=A6=20(GH-13073)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calling setlocale(LC_CTYPE, "") on a system where GetACP() returns CP_UTF8 results in empty strings in _tzname[]. This causes time.tzname to be an empty string. I have reported the bug to the UCRT team and will follow up, but it will take some time get a fix into production. In the meantime one possible workaround is to temporarily change the locale by calling setlocale(LC_CTYPE, "C") before calling _tzset and restore the current locale after if the GetACP() == CP_UTF8 or CP_UTF7 @zooba https://bugs.python.org/issue36779 --- .../next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst | 2 ++ Modules/timemodule.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst diff --git a/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst new file mode 100644 index 0000000..618cfca --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-06-11-15-41-34.bpo-36779.0TMw6f.rst @@ -0,0 +1,2 @@ +Ensure ``time.tzname`` is correct on Windows when the active code page is +set to CP_UTF7 or CP_UTF8. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index f991f31..bdc93a2 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1581,6 +1581,19 @@ init_timezone(PyObject *m) PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600); #endif PyModule_AddIntConstant(m, "daylight", _Py_daylight); +#ifdef MS_WINDOWS + TIME_ZONE_INFORMATION tzinfo = {0}; + GetTimeZoneInformation(&tzinfo); + otz0 = PyUnicode_FromWideChar(tzinfo.StandardName, -1); + if (otz0 == NULL) { + return -1; + } + otz1 = PyUnicode_FromWideChar(tzinfo.DaylightName, -1); + if (otz1 == NULL) { + Py_DECREF(otz0); + return -1; + } +#else otz0 = PyUnicode_DecodeLocale(_Py_tzname[0], "surrogateescape"); if (otz0 == NULL) { return -1; @@ -1590,6 +1603,7 @@ init_timezone(PyObject *m) Py_DECREF(otz0); return -1; } +#endif // MS_WINDOWS PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1); if (tzname_obj == NULL) { return -1; -- cgit v0.12