我有一个构建日期:
from datetime import datetime
from datetime import tzinfo
test = '2013-03-27 23:05'
test2 = datetime.strptime(test,'%Y-%m-%d %H:%M')
>>> test2
datetime.datetime(2013, 3, 27, 23, 5)
>>> test2.replace(tzinfo=EST)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'EST' is not defined
>> test2.replace(tzinfo=UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'UTC' is not defined
我在names
时区列表中找不到可以在replace.tzinfo=
调用中分配给tzinfo的文档。
我已经通读了以下内容,什么都没有:
http://docs.python.org/2/library/datetime.html#tzinfo-对象
我也在谷歌上搜索过。
编辑:我遵循了Undepu提供的解决方案,但我得到了以下内容:
>>> test = '2013-03-27 00:05'
>>> test
'2013-03-27 00:05'
>>> test2 = dt.datetime.strp(test, '%Y-%m-%d %H:%M')
>>> test2
datetime.datetime(2013, 3, 27, 0, 5)
>>> est = pytz.timezone('US/Eastern')
>>> utc = pytz.utc
>>> print(est.localize(test2))
2013-03-27 00:05:00-04:00
>>> print(utc.localize(test2))
2013-03-27 00:05:00+00:00
>>> print(est.localize(test2,is_dst=False))
2013-03-27 00:05:00-04:00
>>> print(est.localize(test2,is_dst=True))
2013-03-27 00:05:00-04:00
>>>
正如您所看到的,即使我提供is_dst=
标志,偏移量仍然是"-04:00",这是EDT而不是EST。我很感激你的帮助。非常感谢。
文件显示以下内容:
如果你坚持使用当地时间,这个图书馆提供了一个明确构建它们的设施:http://pytz.sourceforge.net/#problems-使用本地时间
>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)
>>> est_dt = eastern.localize(loc_dt, is_dst=True)
>>> edt_dt = eastern.localize(loc_dt, is_dst=False)
>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))
2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500
east在文件的早期被定义为eastern = timezone('US/Eastern')
这似乎表明is_dst=
标志应该进一步指定是否指定日光节约。我希望你能帮我解释为什么这对我来说不起作用。
标准库没有定义任何时区——至少不是很好(文档中给出的玩具示例没有处理像这里提到的那些微妙的问题(。对于预定义的时区,请使用第三方pytz模块。
import pytz
import datetime as DT
eastern = pytz.timezone('US/Eastern')
utc = pytz.utc
test = '2013-03-27 23:05'
这是一个"天真"的约会时间:
test2 = DT.datetime.strptime(test, '%Y-%m-%d %H:%M')
print(test2)
# 2013-03-27 23:05:00
这通过将test2
解释为在EST时区中来实现时区感知日期时间:
print(eastern.localize(test2))
# 2013-03-27 23:05:00-04:00
这通过将test2
解释为UTC时区来实现时区感知日期时间:
print(utc.localize(test2))
# 2013-03-27 23:05:00+00:00
或者,您可以使用astimezone
方法将一个时区感知日期时间转换为另一个时区:
test2_eastern = eastern.localize(test2)
print(test2_eastern.astimezone(utc))
# 2013-03-28 03:05:00+00:00
自从Python 3.9发布以来,标准库确实定义了时区,您可以通过获取它们
import zoneinfo
print(zoneinfo.available_timezones())
# {'America/Belem', 'Asia/Tel_Aviv', 'Australia/North', 'Asia/Omsk',
# 'Europe/Isle_of_Man', 'America/New_York', 'Europe/Nicosia',
# 'Pacific/Funafuti', 'America/Ensenada', 'Europe/Mariehamn',
# 'America/Maceio', 'America/Guatemala', 'America/Guadeloupe', ...
- docs-zoneinfo
- 另请参阅tz数据库时区列表
- 在Windows上:确保安装了tzdata并且是最新的
正如@FObersteiner所提到的,从python3.9开始,您不需要安装第三方pytz
,而是使用本机zoneinfo
。
from datetime import datetime
from zoneinfo import ZoneInfo
test = '2013-03-27 23:05'
test2 = datetime.strptime(test,'%Y-%m-%d %H:%M')
date_string = test2.replace(tzinfo=ZoneInfo('US/Eastern'))
print(datestring)
2013-03-27 23:05:00-04:00
import pytz
timezones=pytz.all_timezones
这为所有时区提供