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

def*_*ode 50 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'
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 79

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

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

要获得Python 3.3+的本地时间:

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

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

  • 从 Python 3.6 开始,`astimezone()` 方法现在可以在假定代表系统本地时间的朴素实例上调用。 (4认同)

Ofr*_*viv 37

您需要使您的日期时间对象时区识别.来自datetime文档:

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

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

要使你的日期时间对象有意识,你需要继承tzinfo,就像这里的第二个例子一样,或者更简单 - 使用一个为你做的包,比如pytzpython-dateutil

使用pytz,这看起来像:

import datetime, pytz
datetime.datetime.now(pytz.timezone('US/Central')).isoformat()
Run Code Online (Sandbox Code Playgroud)

您也可以控制输出格式,如果你使用的strftime与"%Z"格式指令一样

datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
Run Code Online (Sandbox Code Playgroud)

  • 不完全正确:%z格式指令打印没有冒号的时区偏移,但ISO格式将TZ说明符中的小时和分钟与冒号分开.但是,在时区感知日期时调用isoformat()方法将起作用! (5认同)
  • 时区感知日期时间将使用.isoformat()正确格式化. (4认同)
  • 谢谢@jedwards和大卫 - 我补充说. (3认同)
  • @jedwards:不要将`datetime.replace()`与pytz时区一起使用,该时区可能有多个UTC偏移(在不同的时间). (3认同)

Wes*_*ner 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'
Run Code Online (Sandbox Code Playgroud)


Dmi*_*kin 7

您可以在 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'
Run Code Online (Sandbox Code Playgroud)

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

>>> 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)
Run Code Online (Sandbox Code Playgroud)