datetime.datetime.utcnow()
datetime
鉴于它明确是UTC,为什么没有任何时区信息datetime
?
我希望这将包含tzinfo
。
datetime.datetime.utcnow()
datetime
鉴于它明确是UTC,为什么没有任何时区信息datetime
?
我希望这将包含tzinfo
。
Answers:
这意味着它是时区幼稚的,所以您不能将其与 datetime.astimezone
你可以给它一个时区
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
现在您可以更改时区
print(u.astimezone(pytz.timezone("America/New_York")))
要获取给定时区的当前时间,可以将tzinfo datetime.now()
直接传递给:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
它适用于任何时区,包括那些遵守夏令时(DST)的时区,即,它适用于在不同时间具有不同utc偏移量(非固定utc偏移量)的时区。请勿使用tz.localize(datetime.now())
-如果当地时间不明确,则在DST结束过渡期间可能会失败。
astimezone
。因此datetime不仅没有本地时区,而且tzinfo唯一可广泛使用的实现不符合假定的标准。
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
;使用datetime.now(tz)
代替。
请注意,对于Python 3.2及更高版本,该datetime
模块包含datetime.timezone
。文档datetime.utcnow()
说明:
可以通过调用获取当前的UTC日期时间。
datetime.now
(
timezone.utc
)
因此,您可以执行以下操作:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)
还是datetime.utcnow(timezone.utc)
?
datetime.utcnow()
不带任何参数。因此必须如此datetime.now(timezone.utc)
。
datetime.now()
将返回机器时间,但datetime.utcnow()
将返回实际UTC时间。
datetime.utcnow()
未设置tzinfo
为表明它是UTC。但datetime.now(datetime.timezone.utc)
不会返回UTC时间与 tzinfo
设定。
tz
在now构造函数中传递一个对象,它将返回该时区的时间?好!感谢您指出。
标准的Python库不包含任何tzinfo类(但请参见pep 431)。我只能猜测原因。我个人认为不为UTC包含tzinfo类是错误的,因为该类没有争议,可以进行标准实现。
编辑:尽管库中没有实现,但是在tzinfo
文档中给出了一个示例。
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
要使用它,以将当前时间作为已知的datetime对象获取:
from datetime import datetime
now = datetime.now(utc)
有datetime.timezone.utc
在Python 3.2+:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime
通过创建的对象utcnow()
)...
timezone.utc
最终已添加到Python 3.2中。为了向后兼容,utcnow()
仍返回一个无时区的时间对象,但是您可以通过调用来获得所需的内容now(timezone.utc)
。
struct
模块将自动从Unicode转换为字节串,最终决定是破坏与早期Python 3版本的兼容性,以防止继续做出错误决定。
tzinfo
文档中包含实现它的代码示例,但是它们没有在日期时间本身中包含该功能! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
是很棒的资源。当我编辑完答案以放入示例代码时,其他人已经提出了建议,而我不想窃取他们的意见。
该pytz
模块是一个选项,还有另一个选项,python-dateutil
尽管它也是第三方软件包,但根据您的其他依赖项和操作系统,它可能已经可用。
我只是想将这种方法包括在内以供参考-如果您已经安装python-dateutil
了其他方法,则可以使用它tzinfo
而不是使用pytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
我倾向于同意,致电utcnow
应包含UTC时区信息。我怀疑这不包括在内,因为本机日期时间库默认为天真日期时间以实现交叉兼容性。
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
是,它总是有效的;datetime.now(dateutil.tz.tzlocal())
在DST转换可能会失败。PEP 495-本地时间消歧可能会改善dateutil
未来的状况。
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(注:dateutil
与非固定的UTC偏移量(如dateutil.tz.tzlocal()
)可能无法在这里使用一个pytz
基于解决方案来代替)。
dateutil
了dateutil.parser
,我喜欢这个解决方案最好。它是那样简单:utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
。中提琴!
朱利安•丹乔(Julien Danjou)写了一篇很好的文章,解释了为什么永远不要处理时区。摘录:
确实,Python datetime API总是返回不知道的datetime对象,这是非常不幸的。确实,一旦您获得此对象之一,就无法知道时区是什么,因此,这些对象本身就非常“无用”。
las,即使您可以使用utcnow()
,也仍然看不到时区信息,就像您发现的那样。
建议:
始终使用感知
datetime
对象,即带有时区信息。这样可以确保您可以直接比较它们(感知datetime
对象和未感知对象是不可比较的),并将它们正确返回给用户。利用pytz具有时区对象。使用ISO 8601作为输入和输出字符串格式。用于
datetime.datetime.isoformat()
将时间戳返回为使用该格式格式化的字符串,其中包括时区信息。如果您需要解析包含ISO 8601格式的时间戳记的字符串,则可以依靠
iso8601
,它返回带有正确时区信息的时间戳记。这使得时间戳直接可比。
timezone
在Python 3.2+中添加信息
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
Python 2.7.13(默认值,2017年1月19日,14:48:08)
由于UTC日期是UTC,因此不需要任何时区信息,根据定义,这意味着它们没有偏移量。
pytz.utc
)。请注意,与UTC的偏移量未知的值与已知为0的值之间存在很大差异。后者utcnow()
应返回IMO。根据文档,这将与“一个有意识的对象用于表示一个无法解释的特定时间”相对应。