是否有一种简单的方法可以将RFC 3339时间转换为常规Python时间戳?
我有一个正在读取ATOM源的脚本,我希望能够将ATOM源中项目的时间戳与文件的修改时间进行比较。
我从ATOM spec注意到,ATOM日期包含时区偏移量(Z<a number>
),但在我的情况下,Z
之后没有任何内容,所以我想我们可以假设GMT
我想我可以使用某种类型的正则表来解析时间,但我希望Python有一种内置的方法,这是我无法找到的。
答案 0 :(得分:22)
您没有包含示例,但如果您没有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
答案 1 :(得分:9)
没有内置,afaik。
<强> feed.date.rfc3339 强> 这是一个Python库模块,其函数用于将RFC 3339格式的时间戳字符串转换为Python时间浮点值,反之亦然。 RFC 3339是Atom订阅源联合格式使用的时间戳格式。
获得BSD许可。
http://home.blarg.net/~steveha/pyfeed.html
(编辑得很清楚我没写过。: - )
答案 2 :(得分:8)
http://pypi.python.org/pypi/iso8601/似乎能够解析iso 7601,RFC 3339是其中的一个子集,也许这可能很有用,但同样不是内置的。
答案 3 :(得分:7)
我经常使用RFC3339日期时间格式,但我找到了一个合适的解决方案来转换date_string&lt; =&gt; datetime_object在两个方向上。
你需要两个不同的外部模块,因为其中一个只能在一个方向进行转换(不幸的是):
首先安装:
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
Heureka!现在您可以轻松地( haha )以可用的格式使用日期字符串和日期字符串。
答案 4 :(得分:6)
http://bugs.python.org/issue15873(http://bugs.python.org/issue5207重复)
看起来还没有内置功能。</ p>
答案 5 :(得分:5)
feedparser.py提供了强大/可扩展的方法来解析现实世界的atom / rss feed中可能遇到的各种日期格式:
>>> from feedparser import _parse_date as parse_date
>>> parse_date('1985-04-12T23:20:50.52Z')
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)
答案 6 :(得分:3)
如果你正在使用Django,你可以使用Django的函数parse_datetime
:
>>> from django.utils.dateparse import parse_datetime
>>> parse_datetime("2016-07-19T07:30:36+05:00")
datetime.datetime(2016, 7, 19, 7, 30, 36, tzinfo=<django.utils.timezone.FixedOffset object at 0x101c0c1d0>)
答案 7 :(得分:2)
试试这个,它对我来说很好用
datetime_obj = datetime.strptime("Mon, 01 Jun 2015 16:41:40 GMT", '%a, %d %b %Y %H:%M:%S GMT')
或
(AAA,BBB,CCC)
答案 8 :(得分:2)
新的datetime.fromisoformat(date_string)方法added in Python 3.7将解析大多数RFC 3339时间戳,包括带有时区偏移的时间戳。这不是一个完整的实现,因此请务必测试您的用例。
>>> from datetime import datetime
>>> datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
>>> datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
>>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
>>> datetime.fromisoformat('2011-11-04T00:05:23+04:00')
datetime.datetime(2011, 11, 4, 0, 5, 23,
tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
答案 9 :(得分:2)
您可以使用 Google API 核心包。他们有一个非常简单的日期时间到 RFC 3339 转换功能。您可以在 their docs 中找到更多信息。
它的用法很简单:
from google.api_core.datetime_helpers import to_rfc3339
rfc3339_str = to_rfc3339(datetime.now())
他们甚至有一个函数可以与 from_rfc3339
和 from_rfc3339_nanos
反过来工作。
答案 10 :(得分:1)
使用Python 3,您可以使用RegEx将RFC 3339时间戳分解为其组件。 然后,直接创建datetime对象,不需要其他模块:
import re
import datetime
def parse_rfc3339(dt):
broken = re.search(r'([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(\.([0-9]+))?(Z|([+-][0-9]{2}):([0-9]{2}))', dt)
return(datetime.datetime(
year = int(broken.group(1)),
month = int(broken.group(2)),
day = int(broken.group(3)),
hour = int(broken.group(4)),
minute = int(broken.group(5)),
second = int(broken.group(6)),
microsecond = int(broken.group(8) or "0"),
tzinfo = datetime.timezone(datetime.timedelta(
hours = int(broken.group(10) or "0"),
minutes = int(broken.group(11) or "0")))))
这个例子将时区或微秒丢失为“0”,但可能需要额外的错误检查。 干杯,亚历克斯
答案 11 :(得分:0)
答案 12 :(得分:0)
在另一个问题中遇到了令人敬畏的dateutil.parser模块,并在我的RFC3339问题上尝试了它,它似乎处理了我抛出的所有内容,更加理智,这个问题中的任何其他响应。
答案 13 :(得分:0)
我一直在深入研究日期和RFC3339,最近遇到arrow library,并且刚刚使用并解决了我的问题:
import arrow
date_string = "2015-11-24 00:00:00+00:00"
my_datetime = arrow.get(date_string).datetime
答案 14 :(得分:0)
对我来说,最简单的解决方案是 dateutil python标准库。
from dateutil.parser import parse
dt = "2020-11-23T11:08:23.022277705Z"
print(parse(dt))
输出:
2020-11-23 11:08:23.022277+00:00
如果不需要时区元素,只需将时区信息设置为 None
print(parse(t).replace(tzinfo=None))
输出是一个漂亮干净的datetime对象:
2020-11-23 11:08:23.022277