質問

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

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

から気づきました アトム仕様, 、ATOM の日付にはタイム ゾーン オフセットが含まれます (Z<a number>)しかし、私の場合、その後には何もありません Z したがって、GMT を想定してよいと思います。

何らかの正規表現を使用して時刻を解析できると思いますが、Python にはそれを実行するための組み込みの方法があることを期待していましたが、私は見つけることができませんでした。

役に立ちましたか?

解決

私の知る限り、組み込みはありません。

フィード.日付.rfc3339これは、RFC 3339 形式のタイムスタンプ文字列を Python 時刻浮動小数点値に、またはその逆に変換する関数を備えた 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/ にあると思われますRFC 3339は、多分これは有用である可能性のサブセットであるISO 8601を、解析しますが、することができ、再び、ないビルトインます。

私は、RFC3339の日時書式たくさんの苦労が、私は両方の方向に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

どの方向のためにあるどのモジュールを覚えておく必要がないため、私は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

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の機能<のhref = "https://docs.djangoproject.com/en/stable/ref/utils/#django.utils.dateparse.parse_datetime" のrel =」を使用することができます"nofollowを> 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のタイムスタンプを破るために正規表現を使用することができます。 その後、直接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")))))

この例でtheadsは「0」として、タイムゾーンやマイクロ秒の欠落が、追加のエラーチェックが必要になる場合があります。 乾杯、アレックス

別の質問に素晴らしい dateutil.parser のモジュールに出くわした、と私のRFC3339の問題でそれを試みたが、それが表示されます私はこの質問の他の回答のいずれかのより健全でそれで投げています。

すべてを処理するには
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top