如何获得包含默认时区的isoformat日期时间字符串?

时间:2010-08-03 23:13:03

标签: python datetime datetime-format

我需要生成一个与iso格式yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE匹配的时间字符串。 now()utcnow()类方法几乎可以实现我想要的效果。

>>> import datetime
>>> #time adjusted for current timezone
>>> datetime.datetime.now().isoformat()
'2010-08-03T03:00:00.000000'
>>> #unadjusted UTC time
>>> datetime.datetime.utcnow().isoformat()
'2010-08-03T10:00:00.000000'
>>>
>>> #How can I do this?
>>> datetime.datetime.magic()
'2010-08-03T10:00:00.000000-07:00'

6 个答案:

答案 0 :(得分:67)

在Python 3.2 +中获取UTC的当前时间:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2015-01-27T05:57:31.399861+00:00'

在Python 3.3 +中获取本地时间:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).astimezone().isoformat()
'2015-01-27T06:59:17.125448+01:00'

说明:datetime.now(timezone.utc)以UTC时间生成时区感知datetime对象。 astimezone()然后将datetime对象的时区更改为系统的语言环境时区(如果不带参数调用)。时区感知datetime对象然后自动生成正确的ISO格式。

答案 1 :(得分:34)

您需要让日期时间对象知道时区。来自datetime docs

  

有两种日期和时间对象:“天真”和“意识”。这种区别是指对象是否具有时区,夏令时或其他类型的算法或政治时间调整的概念。天真的日期时间对象是否代表协调世界时(UTC),当地时间或某个其他时区的时间完全取决于程序,就像程序一样,特定数字是代表米,英里还是质量。天真的日期时间对象易于理解和使用,代价是忽略了现实的某些方面。

当你有一个知道的日期时间对象时,你可以使用isoformat()并获得你需要的输出。

为了让您的日期时间对象有用,您需要subclass tzinfo, like the second example in here,或者更简单 - 使用为您执行此操作的程序包,例如pytzpython-dateutil

使用pytz,这看起来像:

import datetime, pytz
datetime.datetime.now(pytz.timezone('US/Central')).isoformat()

如果你使用带'%z' format directive的strftime

,你也可以控制输出格式
datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')

答案 2 :(得分:17)

使用arrow

>>> import arrow
>>> arrow.now().isoformat()
'2015-04-17T06:36:49.463207-05:00'
>>> arrow.utcnow().isoformat()
'2015-04-17T11:37:17.042330+00:00'

答案 3 :(得分:3)

您可以使用python-dateutil(默认情况下在Mac上安装)在Python 2.7+中执行此操作:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> datetime.now(tzlocal()).isoformat()
'2016-10-22T12:45:45.353489-03:00'

或者,如果您想从现有的存储字符串进行转换:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from dateutil.parser import parse
>>> parse("2016-10-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-10-21T16:33:27.696173-03:00' <-- Atlantic Daylight Time (ADT) 
>>> parse("2016-01-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-01-21T16:33:27.696173-04:00' <-- Atlantic Standard Time (AST)

答案 4 :(得分:0)

九年后。如果您知道您的时区。我喜欢日期和时间之间的T。而且,如果您不想使用微秒。

Python <= 3.8

pip3 install pytz  # needed!

python3
>>> import datetime
>>> import pytz
>>> datetime.datetime.now(pytz.timezone('Europe/Berlin')).isoformat('T', 'seconds')
'2020-11-09T18:23:28+01:00'

在Ubuntu 18.04和Python 3.6.9上进行了测试。


Python> = 3.9

pip3 install tzdata  # only on Windows needed!

py -3
>>> import datetime
>>> import zoneinfo
>>> datetime.datetime.now(zoneinfo.ZoneInfo('Europe/Berlin')).isoformat('T', 'seconds')
'2020-11-09T18:39:36+01:00'

在Windows 10和Python 3.9.0上进行了测试。

答案 5 :(得分:-5)

类似以下示例。注意我在东澳大利亚(UTC +目前10小时)。

>>> import datetime
>>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow()
>>> dtnow
datetime.datetime(2010, 8, 4, 9, 33, 9, 890000)
>>> dtutcnow
datetime.datetime(2010, 8, 3, 23, 33, 9, 890000)
>>> delta = dtnow - dtutcnow
>>> delta
datetime.timedelta(0, 36000)
>>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60)
>>> hh,mm
(10, 0)
>>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm)
'2010-08-04T09:33:09.890000+10:00'
>>>