将RFC 3339时间转换为标准Python时间戳
15 个回答
16
我在处理RFC3339日期时间格式时遇到了很多困难,但我找到了一种合适的方法,可以在日期字符串和日期对象之间相互转换。
你需要两个不同的外部模块,因为其中一个只能单向转换(真不幸):
首先安装:
sudo pip install rfc3339
sudo pip install iso8601
然后引入:
import datetime # for general datetime object handling
import rfc3339 # for date object -> date string
import iso8601 # for date string -> date object
为了不需要记住哪个模块是做哪个方向的转换,我写了两个简单的辅助函数:
def get_date_object(date_string):
return iso8601.parse_date(date_string)
def get_date_string(date_object):
return rfc3339.rfc3339(date_object)
在你的代码中,你可以像这样轻松使用:
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
太好了!现在你可以轻松地(哈哈)使用你的日期字符串,并将其转换为可用的格式。
38
你没有提供例子,不过如果你没有Z偏移量或者时区,并且假设你只想要基本的时间而不是持续时间,那这个可能适合你:
import datetime as dt
>>> dt.datetime.strptime('1985-04-12T23:20:50.52', '%Y-%m-%dT%H:%M:%S.%f')
datetime.datetime(1985, 4, 12, 23, 20, 50, 520000)
strptime()这个函数是在Python 2.5版本的datetime模块中新增的,所以有些人可能还不知道它的存在。
补充说明: 其实time.strptime()这个函数已经存在一段时间了,使用起来和它差不多,可以给你一个struct_time的值:
>>> ts = time.strptime('1985-04-12T23:20:50.52', '%Y-%m-%dT%H:%M:%S.%f')
>>> ts
time.struct_time(tm_year=1985, tm_mon=4, tm_mday=12, tm_hour=23, tm_min=20, tm_sec=50, tm_wday=4, tm_yday=102, tm_isdst=-1)
>>> time.mktime(ts)
482210450.0
14
据我所知,没有内置的功能。
feed.date.rfc3339 这是一个Python库模块,里面有一些函数可以把RFC 3339格式的时间戳字符串转换成Python能用的时间浮点值,反过来也可以。RFC 3339是一种时间戳格式,常用于Atom订阅源的格式。
这个库是BSD许可证的。
http://home.blarg.net/~steveha/pyfeed.html
(编辑过,说明这不是我写的。:-)