将RFC 3339时间转换为标准Python时间戳

36 投票
15 回答
56652 浏览
提问于 2025-04-15 17:15

有没有简单的方法把一个RFC 3339格式的时间转换成普通的Python时间戳?

我有一个脚本在读取ATOM源,我想把ATOM源中某个项目的时间戳和一个文件的修改时间进行比较。

我注意到从ATOM规范中,ATOM日期包含一个时区偏移(Z<一个数字>),但是在我的情况下,Z后面没有任何东西,所以我想我们可以假设是GMT时间。

我想我可以用某种正则表达式来解析这个时间,但我希望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

(编辑过,说明这不是我写的。:-)

撰写回答