将原始时间转换为时区感知时间 (JST)
Posted
技术标签:
【中文标题】将原始时间转换为时区感知时间 (JST)【英文标题】:convert naive time to time-zone aware time (JST) 【发布时间】:2020-04-15 10:16:21 【问题描述】:我有一堆时间对象存储在数据库中,但它们都是天真的对象。他们存储的时间是在“JST”或“亚洲/东京”tz。我尝试使用
naive_time.replace(tzinfo = pytz.timezone('Asia/Tokyo'))
但这将它设置为 LMT+09:19:00 这是不正确的,它应该是 LMT+09:00:00。任何正确的建议。
编辑:
数据库将时间作为datatime.time
对象返回,tzinfo=None
就像datetime.time(1, 0)
。我将其分配给 t 并尝试了
t.replace(tzinfo = pytz.timezone('Asia/Tokyo'))
给了
datetime.time(1, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)
但“亚洲/东京”或 JST 比 LMT 提前 9 小时而不是 9 小时 19 分钟。
【问题讨论】:
欢迎来到 SO,您能否更新您的帖子以使您的问题可重现。目前我们只能推测会发生什么。请阅读 minimal reproducible example 以获取有关如何使您的帖子符合 SO 标准的更多见解。 这能回答你的问题吗? Why does datetime give different timezone formats for the same timezone? 不,它没有。我之前看到了那个答案,但没有帮助 我拥有的幼稚时间对象以这种格式存储值datetime.time(1, 0)
如果我这样做 .replace(tzinfo = pytz.timezone('Asia/Tokyo'))
然后它返回 datetime.time(1, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)
这是不正确的。预期结果应该是datetime.time(1, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:00:00 STD>)
请您发布您的minimal reproducible example 的完整代码(包括导入和存储在您的数据库中的日期时间或时间对象)。
【参考方案1】:
您必须add a date 才能localize
它。否则 DST 的确定是模棱两可的:各国可以选择是否以及何时使用 DST,随着时间的推移会导致很多变化。参见例如timeanddate.com 为 JST
。如果您想深入挖掘,请查看IANA database。
示例:
import datetime
import pytz
naive_time = datetime.time(1, 0)
date = datetime.date(2019, 12, 24)
comb_time = datetime.datetime.combine(date, naive_time)
tz = pytz.timezone('Asia/Tokyo')
loc_time = tz.localize(comb_time)
# loc_time
# datetime.datetime(2019, 12, 24, 1, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
您可以在 Martijn Pieter 的 answer here 中找到更多信息,为什么您不应该使用 replace
方法为幼稚的 datetime
对象设置时区。
在此上下文中不能缺少的一般说明:如果可能,请始终在内部以任何方式使用 UTC - 仅确定供人类读取的输出的本地时间。
【讨论】:
以上是关于将原始时间转换为时区感知时间 (JST)的主要内容,如果未能解决你的问题,请参考以下文章