3

我有点惊讶pythondatetime .isoformat()函数没有返回正确的信息。当向 fromtimestamp() 方法提供时区时,该函数正确返回 ISO 8601 格式的字符串。但是,在计算结果时会忽略时区。观察:

13:29 msimsonnet:~$ python
Python 2.7.1 (r271:86832, Jan 26 2011, 13:56:46) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Running with pythonstartup.py
>>> import pytz,datetime
>>> datetime.datetime.fromtimestamp(1303876413).isoformat()
'2011-04-26T23:53:33'
>>> ny = pytz.timezone('America/New_York')
>>> sf = pytz.timezone('America/Los_Angeles')
>>> datetime.datetime.fromtimestamp(1303876413,ny).isoformat()
'2011-04-26T23:53:33-04:00'
>>> datetime.datetime.fromtimestamp(1303876413,sf).isoformat()
'2011-04-26T20:53:33-07:00'
>>> 

我在 EDT 中的计算机上运行它(格林威治标准时间为 -400)。时间 1303876413 实际上是 2011 年 4 月 26 日晚上 11:53:33,我第一次写这个问题的时候。请注意,在第一个示例中,只是请求.isoformat()返回'2011-04-26T23:53:33',这是错误的——它应该返回'2011-04-26T23:53:33-04:00',因为它返回本地时间并且 Python 知道时区。第二个例子是正确的,但我在 NY 时区对象中卡住了。第三个例子是错误的 --- Python 保留了时区,但它没有相应地调整时间。

附录:

如果您阅读所有评论,您会发现我正在寻找的行为可以使用utcfromtimestamp而不是fromtimestamp

4

1 回答 1

17

确保您使用的是“时区感知”datetime对象,而不是“幼稚”对象。

为了使时区“感知”datetime对象,您需要确保在创建时区时提供时区。

更多细节在这里: http ://docs.python.org/library/datetime.html

此外,ISO 8601不需要时区,并且isoformat 合规的。事实上,它根本不支持时区,只支持与 UTC 的时间偏移

ISO 8601 允许许多不同的格式,例如,这些都是有效的:

2011-04-27
2011-04-27 02:48Z
2011-04-27T02:48Z
2011-W17-3
2011-117

有关详细信息,请参阅http://en.wikipedia.org/wiki/ISO_8601 。

编辑,以解决您的更新:

它不是错误的,它可以正常工作,并且根据文档。天真的 datetime 对象只是没有任何时区信息,句号。因此,没有理由期望他们能够在您致电时为您提供时区信息isoformat()

当您使用时间戳创建对象时,它会根据 python 认为您的系统时区是什么来创建本地时间 datetime 对象。这就是为什么当您给它一个 posix 时间戳时,它会为您将其转换为您的本地时间。请注意,虽然 datetime 模块知道时间戳是 UTC,并且它知道您的本地时区,并fromtimestamp使用该信息来创建 datetime 对象,但生成的对象仍然是幼稚的,并且与时区无关。如果你想使用时间戳,你不应该使用简单的 datetime 对象。

从文档:

一个简单的 datetime 对象是否表示协调世界时 (UTC)、当地时间或其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量一样取决于程序。朴素的日期时间对象易于理解和使用,但代价是忽略了现实的某些方面。

这是该fromtimestamp方法的文档(添加了粗体):

返回POSIX时间戳对应的本地日期时间,如time.time()返回。如果可选参数 tz 为 None 或未指定,则将时间戳转换为平台的本地日期和时间,并且返回的 datetime 对象是幼稚的。

如果你想让它考虑时区,你需要传递一个时区,它不会为你推断它。 仅仅因为它没有做你认为它应该做的事情并不会使它不合规或有问题。它按预期工作,并记录在案。这与越野车几乎相反。

于 2011-04-27T04:02:59.590 回答