84

我需要生成一个与 iso 格式匹配的时间字符串yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE。和 class 方法几乎可以满足我的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'
4

6 回答 6

134

要在 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'

说明:在 UTC 时间datetime.now(timezone.utc)生成一个时区感知对象。然后将对象的时区更改为系统的区域设置时区(如果不带参数调用)。时区感知对象然后自动生成正确的 ISO 格式。datetimeastimezone()datetimedatetime

于 2015-01-27T05:58:31.230 回答
41

您需要让您的日期时间对象了解时区。来自日期时间文档

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

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

为了让你的日期时间对象知道,你需要子类化 tzinfo,就像这里的第二个例子,或者更简单 - 使用为你做的包,比如pytzpython-dateutil

使用 pytz,这看起来像:

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

如果您将 strftime 与'%z' 格式指令一起使用,您还可以控制输出格式,例如

datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
于 2010-08-04T00:05:32.713 回答
17

箭头

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

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

>>> 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)
于 2016-10-22T15:52:36.913 回答
4

九年后。如果你知道你的时区。我喜欢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 上测试。


蟒蛇> = 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 上测试。

于 2020-11-09T17:55:22.163 回答
-15

类似于以下示例。注意我在澳大利亚东部(目前是 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'
>>>
于 2010-08-03T23:44:04.840 回答