我目前在开发一个日历系统的后端,该系统返回Python中的naive datetimes
。前端的工作方式是用户创建各种日历事件,前端返回他们创建的事件的naive datetime
版本(例如,如果用户选择2020年10月5日下午3:00-4:00,前端将返回datetime.datetime(2020, 10, 5, 15, 0, 0)
作为起始时间和datetime.datetime(2011, 10, 5, 16, 0, 0)
作为结束时��)。
我需要做的是将naive datetime
转换成UTC时间并存储到数据库中。系统每个用户已经指定了他们的时区偏好,因此naive datetime
被认为与他们的时区偏好相同。显然,日期时间需要相对于UTC存储,以便如果用户更改其时区,则现有事件仍将在他们安排的正确时间进行呈现。
由于前端不在我的控制范围内,因此我无法更改接收到的数据。数据库设计也不在我的控制范围内,因此我无法更改正在存储的数据及其方式。
以下是我目前采用的大致方法:
import pytz
def convert_to_UTC(naive_datetime, user_tz_preference):
user_datetime = naive_datetime.replace(tzinfo=user_tz_preference)
utc_datetime = user_datetime.astimezone(pytz.utc)
我遇到的问题与夏令时有关:
>>> from datetime import datetime
>>> import pytz
>>> user_tz_preference = pytz.timezone('US/Pacific')
>>> naive_datetime = datetime(2011, 10, 26, 12, 0, 0)
>>> user_datetime = naive_datetime.replace(tzinfo=user_tz_preference)
>>> user_datetime
datetime.datetime(2011, 10, 26, 12, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)
>>> received_utc = user_datetime.astimezone(pytz.utc)
>>> received_utc
datetime.datetime(2011, 10, 26, 20, 0, tzinfo=<UTC>)
>>> expected_utc = datetime(2011, 10, 26, 19, 0, tzinfo=pytz.utc)
>>> expected_utc == received_utc
False
请注意,使用'replace'方法会将时区设置为PST而不是PDT,不管日期如何,这会使其UTC偏移量为8小时,而不是预期的7小时DST偏移量,因此时间最终保存不正确。
我有哪些选项可以将本地时间转换为正确的PDT(或其他基于时区的DST)时区信息?
(另外,请注意,并非所有用户都生活在遵循夏令时的时区,或者可能生活在在不同时间切换的时区,因此如果要在保存之前执行时间差修正类似的解决方案,则需要知道时区是否支持DST以及在哪些日期进行切换)。