Python时区处理



给定:日期为字符串"2022-12-28T20:55:45Z">

结尾的Z表示我所理解的UTC。VM tz是欧洲/巴黎。

import datetime as dt
print(dt.datetime.strptime('2022-12-28T20:55:45Z', '%Y-%m-%dT%H:%M:%S%z').strftime('%s'))
1672257345

那是2022年12月28日下午7:55:45 UTC所以这比实际字符串日期晚了一个小时。

明确定义偏移不会改变任何内容。

print(dt.datetime.strptime('2022-12-28T20:55:45+0000', '%Y-%m-%dT%H:%M:%S%z').strftime('%s'))
1672257345
print(dt.datetime.strptime('2022-12-28T20:55:45+1200', '%Y-%m-%dT%H:%M:%S%z').strftime('%s'))
1672257345

我不明白这怎么可能。20:55:45+1200将等于08:55:45+0000,但python返回相同的epoch。

尝试了具有相同结果的pytz

import pytz
cet = timezone('CET')
k = timezone('Europe/Kiev')
a=dt.datetime.strptime('2022-12-28T20:55:45', '%Y-%m-%dT%H:%M:%S')
cet.localize(a).strftime('%s')
'1672257345'
k.localize(a).strftime('%s')
'1672257345'

不确定.strftime('%s')来自哪里。%s不是一个有效的格式代码,它给出了ValueError: Invalid format string,但.timestamp()为不同的时区给出了不同的数字:

import datetime as dt
a = dt.datetime.strptime('2022-12-28T20:55:45Z', '%Y-%m-%dT%H:%M:%S%z')
print(a, a.timestamp())
b = dt.datetime.strptime('2022-12-28T20:55:45+0000', '%Y-%m-%dT%H:%M:%S%z')
print(b, b.timestamp())
c = dt.datetime.strptime('2022-12-28T20:55:45+1200', '%Y-%m-%dT%H:%M:%S%z')
print(c, c.timestamp())
print((b.timestamp() - c.timestamp()) / 3600)

输出:

2022-12-28 20:55:45+00:00 1672260945.0
2022-12-28 20:55:45+00:00 1672260945.0
2022-12-28 20:55:45+12:00 1672217745.0
12.0

(预计相差12小时)

最新更新