我目前正在为后端系统工作,该系统返回天真的Python日期时间.前端的工作方式是用户创建各种日历事件,前端返回他们创建的事件的天真版本(例如,如果用户选择2020年10月5日下午3:00至4:00,前端返回datetime.datetime(2020,10,5,15,0,0)作为start和datetime.datetime(2011,10,5,16,0,0)作为结束.
我需要做的是采用天真的日期时间并将其转换为UTC以存储在数据库中.系统的每个用户已经指定了他们的时区偏好,因此天真的日期时间被认为与他们的时区偏好具有相同的时区.显然,日期时间需要相对于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)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题与夏令时有关:
>>> 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 …Run Code Online (Sandbox Code Playgroud) import pytz, datetime
pytz.timezone("Asia/Calcutta")
Run Code Online (Sandbox Code Playgroud)
打印以下内容:
< DstTzInfo 'Asia/Calcutta' HMT+5:53:00 STD >
Run Code Online (Sandbox Code Playgroud)
为什么不是05:30呢?我在时区America/Los_Angeles.
>>> now = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.timezone('Asia/Tokyo'))
>>> now
datetime.datetime(2018, 9, 7, 16, 9, 24, 177751, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.timezone('Asia/Tokyo'))
>>> dt
datetime.datetime(2018, 9, 7, 16, 9, 24, 177751, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)
Run Code Online (Sandbox Code Playgroud)
因为now我得到了JST + 9:00:00,因为dt我得到了LMT +9:19:00.我不明白为什么datetime使用不同的格式.
当我比较他们不同的时间时:
>>> now == dt
False
Run Code Online (Sandbox Code Playgroud)
我怎么能转换LMT到JST,这样now == dt …