我编写这个脚本是为了从服务器捕获当前时间,但忘记考虑夏令时。服务器以GMT格式输出时间,所以在耍了一些花招之后,我能够创建一个更清晰的输出。问题是它给我的时间比我在意大利罗马的时区晚两个小时。
我目前使用timedelta(hours=1)
,如果我将hours=1
更改为hours=2
,我得到正确的时间,但我想知道是否有人知道一种简单,无忧的方式来自动化此操作,所以我不必每年更改两次。
到目前为止我写的是:
时间戳是如何从服务器输出的:
logstash_firewall_timestamp = '2023-04-11T14:37:27.840Z'
这里是我转换它的地方,并且已经添加了一个小时:
import datetime
from datetime import datetime,timedelta
pattern = '%Y-%m-%dT%H:%M:%S.%fZ'
dt = datetime.strptime(logstash_firewall_timestamp, pattern)
new_timestamp = str(dt + timedelta(hours=1))[:-3] + 'Z'
这里是最后一个清理:
formatted_time = (''.join(letter for letter in new_timestamp if not letter.isalpha()))[:19]
总结:
时间:格林尼治时间
2023-04-11 14:37:27
当前脚本输出:
2023-04-11 15:37:27
目的输出:
2023-04-11 16:37:27
基于@vighub的回答,但使用Python>= 3.9中可用的zoneinfo
模块,而不是已弃用的pytz
:
import datetime
from zoneinfo import ZoneInfo
server_dtstr = '2023-04-11T14:37:27.840Z' # final 'Z' denotes UTC
server_format = '%Y-%m-%dT%H:%M:%S.%f%z'
server_dt = datetime.datetime.strptime(server_dtstr, server_format)
local_tz = ZoneInfo('Europe/Rome')
local_dt = server_dt.astimezone(local_tz)
output_format = '%Y-%m-%d %H:%M:%S' # or your preferred format
print(local_dt.strftime(output_format))
输出:
2023-04-11 16:37:27
如果你有一个datetime对象,你可以调用作为时区方法转换为合适的时区
from datetime import datetime
import pytz
rome_tz = pytz.timezone('Europe/Rome')
server_date = '2023-04-11T14:37:27.840Z'
pattern = '%Y-%m-%dT%H:%M:%S.%f%z'
# time in UTC, your case
dt = datetime.strptime(server_date, pattern)
# convert in with Rome time with daylight saving
dt_rome = dt.astimezone(rome_tz)
print(dt)
>>> 2023-04-11 14:37:27+00:00
print(dt_rome)
>>> 2023-04-11 16:37:27+02:00
# without daylight saving time
dt = datetime(2023, 1, 11, 12, 37, tzinfo=pytz.UTC)
dt_rome = dt.astimezone(rome_tz)
print(dt_rome)
>>> 2023-01-11 15:37:27+01:00