有没有一种简单的方法可以转换 RFC 3339 时间转换为常规Python时间戳?

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

我注意到从 原子规格, ,ATOM 日期包含时区偏移量(Z<a number>)但是,就我而言,之后什么都没有 Z 所以我想我们可以假设 GMT。

我想我可以用某种正则表达式来解析时间,但我希望 Python 有一种内置的方法来做到这一点,但我一直找不到。

有帮助吗?

解决方案

没有内建,AFAIK。

<强> feed.date.rfc3339 这是一个Python库模块与功能在RFC 3339格式转换时间戳字符串到Python时间浮点值,并且反之亦然。 RFC 3339是由Atom提要联合格式中使用的时间戳格式。

据BSD许可。

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

(编辑所以很显然我没有写它: - )

其他提示

您不包括一个例子,但如果你没有一个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

http://pypi.python.org/pypi/iso8601/ 似乎是能够解析ISO 8601,这RFC 3339是的,也许这可能是有用的一个子集,但同样,没有内置

我与RFC3339 datetime格式的很多努力,但我发现一个合适的解决方案转换DATE_STRING <=> 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!现在您可以轻松(哈哈的)使用日期字符串和日期字符串中使用的格式。

http://bugs.python.org/issue15873 (重复的 http://bugs.python.org/issue5207 )

貌似目前还没有内置的。

feedparser.py 提供健壮/可扩展的方式来分析各种日期格式可能在现实世界的原子遇到/ RSS提要:

>>> 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)

如果您正在使用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>)

试试这个,它工作正常,我

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

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

使用Python 3,可以使用正则表达式来打破RFC 3339时间戳成它的组分。 然后,直接创建日期时间对象,没有额外的模块需要:

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")))))

此示例theads丢失时区或微秒为“0”,但可能需要额外的错误检查。 欢呼声,亚历

跨过另一个问题真棒 dateutil.parser 模块来了,并试图在我的RFC3339的问题,并出现处理一切,我扔掉它更理智,任何在这个问题上的其他答复。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top