mirror of https://github.com/python/cpython.git
bpo-36779: time.tzname returns empty string on Windows if default cod… (GH-13073)
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
This commit is contained in:
parent
95f61c8b16
commit
b4c7defe58
|
@ -0,0 +1,2 @@
|
||||||
|
Ensure ``time.tzname`` is correct on Windows when the active code page is
|
||||||
|
set to CP_UTF7 or CP_UTF8.
|
|
@ -1581,6 +1581,19 @@ init_timezone(PyObject *m)
|
||||||
PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600);
|
PyModule_AddIntConstant(m, "altzone", _Py_timezone-3600);
|
||||||
#endif
|
#endif
|
||||||
PyModule_AddIntConstant(m, "daylight", _Py_daylight);
|
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");
|
otz0 = PyUnicode_DecodeLocale(_Py_tzname[0], "surrogateescape");
|
||||||
if (otz0 == NULL) {
|
if (otz0 == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1590,6 +1603,7 @@ init_timezone(PyObject *m)
|
||||||
Py_DECREF(otz0);
|
Py_DECREF(otz0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif // MS_WINDOWS
|
||||||
PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1);
|
PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1);
|
||||||
if (tzname_obj == NULL) {
|
if (tzname_obj == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue