问题描述
我正在尝试在EST中打印当前时间,但是我的结果却偏离了一个小时(与Google的“最佳本地时间”和“ nyc本地时间”相比)。我尝试同时使用pytz
和dateutil
:
import datetime
import dateutil.tz
import pytz
# Correct
print(datetime.datetime.Now())
# Correct
print(datetime.datetime.Now(dateutil.tz.UTC))
# Off by one hour
print(str(datetime.datetime.Now(dateutil.tz.gettz("EST"))))
# Off by one hour
print(str(pytz.utc.localize(datetime.datetime.utcNow()).astimezone(pytz.timezone("EST"))))
我已经尝试研究执行此操作的正确方法,以上就是我所发现的结果,但结果不正确(例如,当Google表示上午11点时,它表示美国东部标准时间上午10点)。我的本地时间配置正确。我想念什么吗?
我正在使用:
- Python 3.8.5
- python-dateutil 2.8.1
- pytz 2020.1
解决方法
因为此时夏令时有效,所以您的时间减少了一个小时,而您指定EST
时则不显示。
如问题注释中所述-您应使用基于特定地点的时区名称,例如America/New_York
而不是EST
。
EST
在pytz和dateutil中都起作用的原因是 被定义为IANA时区名称:
来自:https://github.com/eggert/tz/blob/2020a/northamerica#L188-L206
我们生成以下指定的文件,以防止使用 过期信息保留在时区二进制目录中。 我们将列表限制为以前版本中出现的名称 这个时区包...
# Zone NAME STDOFF RULES FORMAT [UNTIL] Zone EST -5:00 - EST Zone MST -7:00 - MST Zone HST -10:00 - HST Zone EST5EDT -5:00 US E%sT Zone CST6CDT -6:00 US C%sT Zone MST7MDT -7:00 US M%sT Zone PST8PDT -8:00 US P%sT
如您所见,EST
,MST
和HST
用固定的偏移量定义。他们没有遵守任何DST规则。没有PST
或CST
的类似条目,也没有EDT
之类的日光变量。
名称为EST5EDT
的时区向后兼容较早的POSIX风格的时区,但仅定义了这4个时区。
通常来说,您不应使用任何这些区域。他们只是在那里守卫。