我需要生成一个与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'
答案 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,或者更简单 - 使用为您执行此操作的程序包,例如pytz或python-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'
>>>