30

RFC 3339時刻を通常の Python タイムスタンプに変換する簡単な方法はありますか?

ATOM フィードを読み取るスクリプトがあり、ATOM フィード内のアイテムのタイムスタンプをファイルの変更時刻と比較できるようにしたいと考えています。

ATOM の仕様から、 ATOM の日付にはタイム ゾーン オフセット ( ) が含まれていることに気付きましたZ<a number>が、私の場合は の後に何もないZため、GMT を想定できると思います。

ある種の正規表現を使用して時間を解析できると思いますが、Python にそれを行うための組み込みの方法があり、それを見つけることができなかったことを望んでいました。

4

15 に答える 15

35

例は含まれていませんが、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
于 2009-12-21T19:20:43.050 に答える
15

私は RFC3339 の日時形式にかなり苦労しましたが、date_string <=> datetime_object を両方向に変換する適切な解決策を見つけました。

2 つの異なる外部モジュールが必要です。そのうちの 1 つは一方向の変換しかできないためです (残念ながら):

最初のインストール:

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

どのモジュールがどの方向のものかを覚える必要がないように、2 つの単純なヘルパー関数を書きました。

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

ヘレカ!これで、日付文字列と日付文字列を使用可能な形式で簡単に (笑) 使用できるようになりました。

于 2016-03-13T00:30:58.347 に答える
11

ビルトインはありません。

feed.date.rfc3339 これは、RFC 3339 形式のタイムスタンプ文字列を Python 時刻浮動小数点値に、またはその逆に変換する関数を備えた Python ライブラリ モジュールです。RFC 3339 は、Atom フィード シンジケーション フォーマットで使用されるタイムスタンプ フォーマットです。

BSDライセンスです。

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

(私が書いていないことが明らかなように編集しました。:-)

于 2009-12-21T19:06:26.310 に答える
8

http://pypi.python.org/pypi/iso8601/は、RFC3339がサブセットであるiso8601を解析できるようです。おそらくこれは便利かもしれませんが、組み込みではありません。

于 2009-12-21T19:13:29.210 に答える
6

http://bugs.python.org/issue15873 ( http://bugs.python.org/issue5207 の複製)

ビルトインはまだないようです。

于 2009-12-21T19:05:04.983 に答える
5

feedparser.pyは、現実世界の atom/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)
于 2009-12-21T21:56:31.313 に答える
2

別の質問で素晴らしいdateutil.parserモジュールに出くわし、RFC3339 の問題で試してみたところ、この質問の他の回答よりも正気で投げたものすべてを処理しているようです。

于 2012-08-27T13:20:05.363 に答える
2

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」として表示していますが、追加のエラー チェックが必要になる場合があります。乾杯、アレックス

于 2016-06-07T09:31:38.193 に答える
0

rfc3339ライブラリ:http ://henry.precheur.org/python/rfc3339

于 2011-08-30T13:46:05.067 に答える
0

私はdateimesとRFC3339を深く掘り下げていて、最近矢印ライブラリに出くわし、私の問題を使用して解決しました:

import arrow

date_string = "2015-11-24 00:00:00+00:00"
my_datetime = arrow.get(date_string).datetime
于 2020-08-21T15:33:43.787 に答える