datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
为什么没有datetime任何时区信息,因为它明确是UTC datetime?
我希望这会包含tzinfo.
Joh*_*ooy 177
这意味着它是时区天真,所以你不能使用它 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
Run Code Online (Sandbox Code Playgroud)
现在你可以改变时区了
print(u.astimezone(pytz.timezone("America/New_York")))
Run Code Online (Sandbox Code Playgroud)
要获得给定时区的当前时间,您可以datetime.now()直接将tzinfo传递给:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Run Code Online (Sandbox Code Playgroud)
它适用于任何时区,包括观察夏令时(DST)的时区,即适用于在不同时间可能具有不同utc偏移的时区(非固定的utc偏移).不要使用tz.localize(datetime.now())- 当本地时间不明确时,它可能在DST转换结束时失败.
Cra*_*een 111
请注意,对于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)
Run Code Online (Sandbox Code Playgroud)
Mar*_*som 69
标准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()
Run Code Online (Sandbox Code Playgroud)
要使用它,要将当前时间作为识别日期时间对象:
from datetime import datetime
now = datetime.now(utc)
Run Code Online (Sandbox Code Playgroud)
有datetime.timezone.utc在Python 3.2+:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
Run Code Online (Sandbox Code Playgroud)
bbe*_*ort 19
该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())
Run Code Online (Sandbox Code Playgroud)
我倾向于同意呼叫utcnow应该包括UTC时区信息.我怀疑这不包括在内,因为本机日期时间库默认为天真的日期时间以实现交叉兼容性.
Joe*_*rea 10
Julien Danjou写了一篇很好的文章,解释了为什么你永远不应该处理时区.摘录:
实际上,Python datetime API总是返回不知道的日期时间对象,这是非常不幸的.实际上,只要你得到这个对象中的一个,就无法知道时区是什么,因此这些对象本身就非常"无用".
唉,即使你可能会使用utcnow(),你仍然不会看到你所发现的时区信息.
建议:
始终使用感知
datetime对象,即使用时区信息.这确保您可以直接比较它们(有意识和无意识的datetime对象不具有可比性),并将它们正确地返回给用户.利用pytz来获得时区对象.使用ISO 8601作为输入和输出字符串格式.用于
datetime.datetime.isoformat()将时间戳作为使用该格式格式化的字符串返回,其中包括时区信息.如果您需要解析包含ISO 8601格式的时间戳的字符串,您可以依赖
iso8601,它返回带有正确时区信息的时间戳.这使得时间戳可以直接比较.
小智 7
timezone在Python 3.2+中添加信息
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
Run Code Online (Sandbox Code Playgroud)
将 UTC 时间作为原始日期时间对象返回的行为datetime.datetime.utcnow()显然是有问题的,必须修复。如果您的系统本地时区不是 UTC,则可能会导致意外结果,因为日期时间库假定原始日期时间对象来表示系统本地时间。例如,datetime.datetime.utcnow().timestaamp()给出的时间戳比我的计算机上的正确值提前 4 小时。此外,从 python 3.6 开始,datetime.astimezone()可以在原始日期时间实例上调用,但datetime.datetime.utcnow().astimezone(any_timezone)会给出错误的结果,除非您的系统本地时区是 UTC。
| 归档时间: |
|
| 查看次数: |
127577 次 |
| 最近记录: |