[formatter] fix local DST datetime offsets for ':O'
'O' would get the *current* local UTC offset and apply it to all 'datetime' objects it gets applied to. This would result in a wrong offset if the current offset includes DST and the target 'datetime' does not or vice-versa. 'O' now determines the correct local UTC offset while respecting DST for each individual 'datetime'.
This commit is contained in:
@@ -375,18 +375,18 @@ def _parse_offset(format_spec, default):
|
||||
fmt = _build_format_func(format_spec, default)
|
||||
|
||||
if not offset or offset == "local":
|
||||
is_dst = time.daylight and time.localtime().tm_isdst > 0
|
||||
offset = -(time.altzone if is_dst else time.timezone)
|
||||
def off(dt):
|
||||
local = time.localtime(util.datetime_to_timestamp(dt))
|
||||
return fmt(dt + datetime.timedelta(0, local.tm_gmtoff))
|
||||
else:
|
||||
hours, _, minutes = offset.partition(":")
|
||||
offset = 3600 * int(hours)
|
||||
if minutes:
|
||||
offset += 60 * (int(minutes) if offset > 0 else -int(minutes))
|
||||
offset = datetime.timedelta(0, offset)
|
||||
|
||||
offset = datetime.timedelta(seconds=offset)
|
||||
|
||||
def off(obj):
|
||||
return fmt(obj + offset)
|
||||
def off(obj):
|
||||
return fmt(obj + offset)
|
||||
return off
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user