将原始时间转换为时区感知时间 (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)的主要内容,如果未能解决你的问题,请参考以下文章

将数字偏移量转换为时区?

date-fns 将 UTC 转换为时区

Jooq java api,在选择查询中将日期时间转换为时区

将 UTC 偏移量转换为时区或日期

传递列以转换为时区值

在 Excel 中将原始数字转换为时间戳