设置具有特定时区的日期时间

Posted

技术标签:

【中文标题】设置具有特定时区的日期时间【英文标题】:set a datetime with a specific timezone 【发布时间】:2021-09-12 12:10:16 【问题描述】:

我在 Heroku 上有一个脚本,因此我不知道每次重启时它驻留在哪里(-> 我无法手动设置 datetime.timedelta),我需要在罗马时间下午 5 点运行一个例程。这个脚本一直有效,至少在今年冬天是这样,但现在它开始一小时,所以是下午 6 点。

import datetime
import pytz


tz = pytz.timezone("Europe/Rome")

now = datetime.datetime.now(tz=tz)
start = datetime.datetime(now.year, now.month, now.day, hour=17, tzinfo=tz)

This answer 表明

使用标准日期时间构造函数的 tzinfo 参数对许多时区的 pytz “不起作用”

所以我尝试使用 tz.localize(start) 进行重构,但在第一次重新启动时,系统将例程安排在下午 3 点,两小时前 。我很困惑:如何在特定时区设置特定时间?

【问题讨论】:

这能回答你的问题吗? How can I force pytz to use currently standard timezones? 我们有 2021 年 6 月 - 如果可以,请避免使用 pytz。使用zoneinfo(Python 3.9 的标准库)- 没有这样的问题。 @MrFuppes 升级到 python 3.9 是可能的,但恐怕需要注意其他依赖项。目前,我正在考虑任何其他可能性 其他可能性是通过backports 使用zoneinfo 或使用dateutil(它可以很好地转换为zoneinfo 模块)。两种可能 【参考方案1】:

因为我需要快速解决这个问题,所以我接受了@MrFuppes 给我的将 Python 版本升级到 3.9 的提示,因为我使用的是 3.7,所以这没什么大不了的,至少对于我的依赖项而言。

使用ZoneInfo

from zoneinfo import ZoneInfo
import datetime


tz = ZoneInfo("Europe/Rome")

now = datetime.datetime.now(tz=tz)
start = datetime.datetime(now.year, now.month, now.day, hour=17, tzinfo=tz)

【讨论】:

以上是关于设置具有特定时区的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?

Python - 在特定时区设置日期时间(没有 UTC 转换)

RuntimeWarning:DateTimeField 收到一个天真的日期时间,具有正确的时区和设置

Rails 3:如何在特定时区获取今天的日期?

创建具有特定时区的 NSDate 对象

根据特定时区计算日期