mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
Issue #6478: _strptime's regexp cache now is reset after changing timezone
with time.tzset().
This commit is contained in:
commit
3ab6c981e7
3 changed files with 50 additions and 15 deletions
|
@ -77,6 +77,8 @@ class LocaleTime(object):
|
|||
self.__calc_date_time()
|
||||
if _getlang() != self.lang:
|
||||
raise ValueError("locale changed during initialization")
|
||||
if time.tzname != self.tzname or time.daylight != self.daylight:
|
||||
raise ValueError("timezone changed during initialization")
|
||||
|
||||
def __pad(self, seq, front):
|
||||
# Add '' to seq to either the front (is True), else the back.
|
||||
|
@ -161,15 +163,17 @@ class LocaleTime(object):
|
|||
|
||||
def __calc_timezone(self):
|
||||
# Set self.timezone by using time.tzname.
|
||||
# Do not worry about possibility of time.tzname[0] == timetzname[1]
|
||||
# and time.daylight; handle that in strptime .
|
||||
# Do not worry about possibility of time.tzname[0] == time.tzname[1]
|
||||
# and time.daylight; handle that in strptime.
|
||||
try:
|
||||
time.tzset()
|
||||
except AttributeError:
|
||||
pass
|
||||
no_saving = frozenset({"utc", "gmt", time.tzname[0].lower()})
|
||||
if time.daylight:
|
||||
has_saving = frozenset({time.tzname[1].lower()})
|
||||
self.tzname = time.tzname
|
||||
self.daylight = time.daylight
|
||||
no_saving = frozenset({"utc", "gmt", self.tzname[0].lower()})
|
||||
if self.daylight:
|
||||
has_saving = frozenset({self.tzname[1].lower()})
|
||||
else:
|
||||
has_saving = frozenset()
|
||||
self.timezone = (no_saving, has_saving)
|
||||
|
@ -326,13 +330,15 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
|
|||
|
||||
global _TimeRE_cache, _regex_cache
|
||||
with _cache_lock:
|
||||
|
||||
if _getlang() != _TimeRE_cache.locale_time.lang:
|
||||
locale_time = _TimeRE_cache.locale_time
|
||||
if (_getlang() != locale_time.lang or
|
||||
time.tzname != locale_time.tzname or
|
||||
time.daylight != locale_time.daylight):
|
||||
_TimeRE_cache = TimeRE()
|
||||
_regex_cache.clear()
|
||||
locale_time = _TimeRE_cache.locale_time
|
||||
if len(_regex_cache) > _CACHE_MAX_SIZE:
|
||||
_regex_cache.clear()
|
||||
locale_time = _TimeRE_cache.locale_time
|
||||
format_regex = _regex_cache.get(format)
|
||||
if not format_regex:
|
||||
try:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue