将UTC时间转换为UTC+2(罗马),同时考虑到DST(日光节约)



我编写这个脚本是为了从服务器捕获当前时间,但忘记考虑夏令时。服务器以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

相关内容

  • 没有找到相关文章

最新更新