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

Mar*_*iek 18 python datetime rfc3339

有没有简单的方法将RFC 3339时间转换为常规Python时间戳?

我有一个正在读取ATOM源的脚本,我希望能够将ATOM源中项目的时间戳与文件的修改时间进行比较.

我从ATOM规范中注意到,ATOM日期包括时区偏移量(Z<a number>),但在我的情况下,之后没有任何内容,Z所以我猜我们可以假设GMT.

我想我可以用某种类型的正则表来解析时间,但我希望Python有一种内置的方式来做我以前无法找到的方法.

Pet*_*sen 23

您没有包含示例,但如果您没有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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • +1使用标准库的解决方案! (8认同)
  • 这不起作用 - 非时区感知的方法不兼容RFC 3339. (8认同)
  • @Yarin:*"Z之后没有任何内容"* - 表示输入为UTC,可以使用`strptime()`.虽然不应该使用在当地时区预期时间的`mktime()`.可以使用`calendar.timegm()`代替(与os.path.getmtime()`:*的结果进行比较我希望能够将ATOM提要中项目的时间戳与修改文件的时间."*) (2认同)

Ale*_*vik 10

没有内置,afaik.

feed.date.rfc3339 这是一个Python库模块,其函数用于将RFC 3339格式的时间戳字符串转换为Python时间浮点值,反之亦然.RFC 3339是Atom订阅源联合格式使用的时间戳格式.

它是BSD许可的.

http://home.blarg.net/~steveha/pyfeed.html

(编辑得很清楚,我没有写它.:-)

  • 另外,我编写了 PyFeed(和 Xe)库,并且我在 StackOverflow 上闲逛,所以如果您对此有任何疑问,我很乐意回答。 (2认同)

Ser*_*rev 9

对我来说最简单的解决方案是dateutil python 标准库。

from dateutil.parser import parse

dt = "2020-11-23T11:08:23.022277705Z"
print(parse(dt))
Run Code Online (Sandbox Code Playgroud)

输出:

2020-11-23 11:08:23.022277+00:00
Run Code Online (Sandbox Code Playgroud)

如果您不需要时区元素,只需将时区信息设置为None

print(parse(t).replace(tzinfo=None))
Run Code Online (Sandbox Code Playgroud)

输出是一个漂亮且干净的日期时间对象:

2020-11-23 11:08:23.022277
Run Code Online (Sandbox Code Playgroud)


zpo*_*pon 8

http://pypi.python.org/pypi/iso8601/似乎能够解析iso 7601,RFC 3339是其中的一个子集,也许这可能很有用,但同样不是内置的.


Men*_*cus 7

我经常使用RFC3339日期时间格式,但我找到了一个合适的解决方案,可以在两个方向上转换date_string <=> datetime_object.

您需要两个不同的外部模块,因为其中一个模块只能在一个方向上进行转换(不幸的是):

首次安装:

sudo pip install rfc3339
sudo pip install iso8601
Run Code Online (Sandbox Code Playgroud)

然后包括:

import datetime     # for general datetime object handling
import rfc3339      # for date object -> date string
import iso8601      # for date string -> date object
Run Code Online (Sandbox Code Playgroud)

为了不需要记住哪个模块是哪个方向,我写了两个简单的辅助函数:

def get_date_object(date_string):
  return iso8601.parse_date(date_string)

def get_date_string(date_object):
  return rfc3339.rfc3339(date_object)
Run Code Online (Sandbox Code Playgroud)

您可以在代码中轻松使用,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

Heureka!现在您可以轻松(哈哈)以可用的格式使用日期字符串和日期字符串.


Fli*_*imm 7

如果您使用的是 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>)
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 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)
Run Code Online (Sandbox Code Playgroud)

  • cool-NR,如果你有一个时间浮点值,你可以调用`time.gmtime()`并得到`struct_time`值.使用时间浮点值做相对时间要容易得多; 从现在开始的两天只是`tf + 2*seconds_per_day`(其中`seconds_per_day`是24*60*60).Python的`struct_time`非常适合检查(一周中的哪一天?)但是计算起来非常不方便. (2认同)

dfo*_*tic 5

试试这个,对我来说效果很好

datetime_obj =  datetime.strptime("2014-01-01T00:00:00Z", '%Y-%m-%dT%H:%M:%SZ')
Run Code Online (Sandbox Code Playgroud)

或者

datetime_obj = datetime.strptime("Mon, 01 Jun 2015 16:41:40 GMT", '%a, %d %b %Y %H:%M:%S GMT')
Run Code Online (Sandbox Code Playgroud)

  • 它不支持数字 utc 偏移量:`+HHMM`。第二个示例不是 [rfc 3339](https://tools.ietf.org/html/rfc3339#section-5.6);它是 [rfc 5322](https://tools.ietf.org/html/rfc5322#section-3.3) (6认同)

dln*_*385 5

Python 3.7添加的新datetime.fromisoformat(date_string)方法将解析大多数 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)))
Run Code Online (Sandbox Code Playgroud)

  • Python 3.10.4 报告 `无效的 isoformat 字符串:'2022-05-08T02:47:35.839Z'` (12认同)