Generate RFC 3339 timestamp in Python
我正在尝试在python中生成一个RFC3339 UTC时间戳。到目前为止,我已经能够做到以下几点:
1 2 3 | >>> d = datetime.datetime.now() >>> print d.isoformat('T') 2011-12-18T20:46:00.392227 |
我的问题是设置UTC偏移量。
根据文档,类方法
这就是我迷路的地方——为什么TZINFO是一个抽象类,我应该如何实现它?
(注意:在PHP中,它和
时区是一种痛苦,这可能就是为什么它们选择不将它们包括在日期时间库中的原因。
试试PYTZ,它有你要找的TZINFO:http://pytz.sourceforge.net网站/
您需要首先创建
1 2 3 | d = datetime.datetime.utcnow() d_with_timezone = d.replace(tzinfo=pytz.UTC) d_with_timezone.isoformat() |
'2017-04-13T14:34:23.111142+00:00'
或者,只需使用UTC,在末尾加上一个"Z"(表示祖鲁时区),将"时区"标记为UTC。
1 2 | d = datetime.datetime.utcnow() # <-- get time in UTC print d.isoformat("T") +"Z" |
'2017-04-13T14:34:23.111142Z'
在Python 3.3 +中:
1 2 3 4 | >>> from datetime import datetime, timezone >>> local_time = datetime.now(timezone.utc).astimezone() >>> local_time.isoformat() '2015-01-16T16:52:58.547366+01:00' |
在旧的python版本上,如果只需要一个以UTC表示当前时间的感知日期时间对象,那么可以定义一个简单的TZINFO子类,如文档中所示,以表示UTC时区:
1 2 3 4 5 | from datetime import datetime utc_now = datetime.now(utc) print(utc_now.isoformat('T')) # -> 2015-05-19T20:32:12.610841+00:00 |
您还可以使用
1 2 3 4 5 6 | #!/usr/bin/env python from datetime import datetime from tzlocal import get_localzone # $ pip install tzlocal now = datetime.now(get_localzone()) print(now.isoformat('T')) |
它可以在python 2和3上工作。
在您链接到的同一个文档中,它进一步解释了如何实现它,给出了一些示例,包括
我很难使用rfc339日期时间格式,但我找到了一个合适的解决方案来在两个方向上转换日期字符串<=>datetimeu对象。
您需要两个不同的外部模块,因为其中一个模块只能在一个方向上进行转换(不幸的是):
第一次安装:
1 2 | sudo pip install rfc3339 sudo pip install iso8601 |
然后包括:
1 2 3 | import datetime # for general datetime object handling import rfc3339 # for date object -> date string import iso8601 # for date string -> date object |
为了不需要记住哪个模块是哪个方向,我编写了两个简单的助手函数:
1 2 3 4 5 | def get_date_object(date_string): return iso8601.parse_date(date_string) def get_date_string(date_object): return rfc3339.rfc3339(date_object) |
在代码中,您可以这样轻松地使用:
1 2 3 4 5 6 7 8 | input_string = '1989-01-01T00:18:07-05:00' test_date = get_date_object(input_string) # >>> datetime.datetime(1989, 1, 1, 0, 18, 7, tzinfo=<FixedOffset '-05:00' datetime.timedelta(-1, 68400)>) test_string = get_date_string(test_date) # >>> '1989-01-01T00:18:07-05:00' test_string is input_string # >>> True |
尤里卡!现在,您可以轻松地(哈哈)使用日期字符串和日期字符串的可用格式。
pytz包可用于python 2.x和3.x。它实现了
要添加UTC偏移量:导入日期时间进口吡兹
1 2 | dt = datetime.datetime(2011, 12, 18, 20, 46, 00, 392227) utc_dt = pytz.UTC.localize(dt) |
现在这个:
1 | print utc_dt.isoformat() |
将打印:
1 | 2011-12-18T20:46:00.392227+00:00 |
您确实可以使用内置的日期时间模块。AS卢卡提到,在显示方式的页面。如果你看一下你会的请参阅一个显示许多不同用例的长示例。这是密码您正在寻找,它将生成一个RFC3339 UTC时间戳。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | from datetime import tzinfo, timedelta, datetime import time as _time ZERO = timedelta(0) STDOFFSET = timedelta(seconds=-_time.timezone) if _time.daylight: DSTOFFSET = timedelta(seconds=-_time.altzone) else: DSTOFFSET = STDOFFSET DSTDIFF = DSTOFFSET - STDOFFSET class LocalTimezone(tzinfo): def utcoffset(self, dt): if self._isdst(dt): return DSTOFFSET else: return STDOFFSET def dst(self, dt): if self._isdst(dt): return DSTDIFF else: return ZERO def tzname(self, dt): return _time.tzname[self._isdst(dt)] def _isdst(self, dt): tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, 0) stamp = _time.mktime(tt) tt = _time.localtime(stamp) return tt.tm_isdst > 0 Local = LocalTimezone() d = datetime.now(Local) print d.isoformat('T') # which returns # 2014-04-28T15:44:45.758506-07:00 |
我刚开始使用的另一个有用的实用程序:用于时区处理和日期分析的dateutil库。推荐,包括这个答案