在Python中生成RFC 3339时间戳

2024-09-27 21:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python生成一个RFC 3339UTC时间戳。到目前为止,我已经做到了以下几点:

>>> d = datetime.datetime.now()
>>> print d.isoformat('T')
2011-12-18T20:46:00.392227

我的问题是设置UTC偏移量。

根据docs,classmethoddatetime.now([tz]),接受一个可选的tz参数,其中tz must be an instance of a class tzinfo subclass,并且datetime.tzinfoan abstract base class for time zone information objects.

这就是我迷路的地方-为什么tzinfo是一个抽象类,我应该如何实现它?


注意:在PHP中,它就像timestamp = date(DATE_RFC3339);一样简单,这就是为什么我不能理解Python的方法为何如此复杂……)


Tags: andocsdatetimerfc时间nowclasstz
3条回答

时区是一种痛苦,这可能就是为什么他们选择不将它们包含在datetime库中。

试试pytz,它有你要找的tzinfo: http://pytz.sourceforge.net/

您需要首先创建datetime对象,然后应用如下所示的时区,然后.isoformat()输出将根据需要包括UTC偏移:

d = datetime.datetime.utcnow()
d_with_timezone = d.replace(tzinfo=pytz.UTC)
d_with_timezone.isoformat()

'2017-04-13T14:34:23.111142+00:00'

或者,只需使用UTC,并在末尾抛出一个“Z”(表示Zulu时区),将“时区”标记为UTC。

d = datetime.datetime.utcnow() # <-- get time in UTC
print d.isoformat("T") + "Z"

'2017-04-13T14:34:23.111142Z'

在Python3.3+中:

>>> from datetime import datetime, timezone                                
>>> local_time = datetime.now(timezone.utc).astimezone()
>>> local_time.isoformat()
'2015-01-16T16:52:58.547366+01:00'

在较旧的Python版本中,如果您只需要一个表示当前时间(以UTC表示)的aware datetime对象,那么您可以define a simple tzinfo subclass as shown in the docs to represent UTC timezone

from datetime import datetime

utc_now = datetime.now(utc)
print(utc_now.isoformat('T'))
# -> 2015-05-19T20:32:12.610841+00:00

您还可以使用^{} module来获取表示本地时区的pytz时区:

#!/usr/bin/env python
from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal

now = datetime.now(get_localzone())
print(now.isoformat('T'))

它在Python 2和3上都能工作。

Further down在链接到的同一文档中,它解释了如何实现它,给出了一些示例,包括UTC类(表示UTC)的完整代码、FixedOffset类(表示与UTC有固定偏移量的时区,而不是带有DST和whatnot的时区)以及其他一些示例。

相关问题 更多 >

    热门问题