如何获得包含默认时区的isoformatdate时间string?

我需要产生一个时间string,匹配iso格式yyyy-mm-ddThh:mm:ss.ssssss-ZO:NEnow()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' 

像下面的例子。 注意我在东澳大利亚(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' >>> 

在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格式。

你需要让你的date时间对象时区知道。 从date时间文档 :

有两种date和时间对象:“天真”和“意识”。 这种区分是指对象是否具有时区,夏令时或其他types的algorithm或政治时间调整的概念。 无论是天真的date时间对象代表协调世界时(UTC),本地时间还是某个其他时区的时间,都完全取决于程序,就像程序是否代表米,英里或质量一样。 天真的date时间对象很容易理解和使用,代价是忽略了现实的某些方面。

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

为了让你的date时间对象,意识到,你需要inheritancetzinfo,就像在这里的第二个例子 ,或者更简单 – 使用一个包,为你做pytz或python-dateutil

使用pytz,这将看起来像:

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

你也可以控制输出格式,如果你使用'%z'格式的指令 strftime

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

带箭头 :

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

你可以用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' 

或者,如果你想从一个已经存储的string转换:

 >>> 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)