按给定的偏移量调整日期时间

Adjusting a datetime by a given offset

python 3.8.0(但如果需要可以更新到更高版本)

我系统中的用户可以设置他们的时区,该时区存储为字符串,例如Europe/London.

使用这个,我可以计算出它们相对于服务器时间 (UTC) 的偏移量,例如设置 Europe/London 的用户,它们的偏移量是 +0100

基本上我想要实现的是,当用户安排事件发生时,他们将输入他们希望在他们的时区发生的日期和时间,然后我需要将其转换为 UTC 时间戳, 所以它将 运行 在服务器上的正确时间。

因此,作为示例,这是一个简化的脚本:

import pytz
from datetime import datetime, timezone, timedelta

server_time = datetime.today()

user_timezone_setting = 'Europe/London'
user_timezone = pytz.timezone(user_timezone_setting)
user_time = datetime.now(user_timezone)
offset = datetime.now(user_timezone).strftime('%z')

print('Server Time: ' + str(server_time.strftime('%H:%M:%S')))
print('User Timezone: ' + user_timezone_setting)
print('User Time: ' + str(user_time.strftime('%H:%M:%S')))
print('Offset to Server Time: ' + str(offset))

print()

time_to_adjust = datetime.strptime('24-06-2020 20:00', '%d-%m-%Y %H:%M')
print('Date Time to adjust by offset: ' + str(time_to_adjust))
print('Timestamp: ' + str(int(time_to_adjust.timestamp())))

print('Adding offset '+ offset + ' to the date time... Expected result (1593032400)')

adjusted = None
print('Adjusted time: ' + str(adjusted))

所以首先,我们计算出他们的时区相对于服务器时间的偏移量,并将其存储在 offset 变量中。

然后我们模拟他们选择的日期时间来安排他们的活动,在本例中为 24-06-2020 20:00。我们希望 Europe/London 时区的日期时间。

所以我们将该日期时间字符串加载到服务器上的日期时间变量中,该变量现在以 UTC (1593028800) 格式存储该日期时间。

然后我基本上只想将偏移量应用到日期时间,这样我就可以按照以下行做一些事情

adjusted = time_to_adjust.adjust_by_offset(offset).timestamp()

并得到 (1593032400) 的预期结果。


任何人都可以建议如何实现这一目标吗?谢谢。

方式过于复杂了。

user_timezone = pytz.timezone(user_timezone_setting)
the_event = datetime.strptime('24-06-2020 20:00', '%d-%m-%Y %H:%M')  # datetime(2020, 6, 24, 20, 0)
localized_event = user_timezone.localize(the_event)  # datetime(2020, 6, 24, 20, 0, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>)
print(localized_event.timestamp())  # 1593025200.0

这就是您所需要的。这为您提供了事件的 UNIX 时间戳

如果您想查看本地化为 UTC 的时间:

utc_event = localized_event.astimezone(timezone.utc)
print(utc_event)  # datetime(2020, 6, 24, 19, 0, tzinfo=datetime.timezone.utc)