Frage

Gibt es eine einfache Möglichkeit, eine zu konvertieren? RFC 3339 Zeit in einen regulären Python-Zeitstempel umwandeln?

Ich habe ein Skript, das einen ATOM-Feed liest, und möchte den Zeitstempel eines Elements im ATOM-Feed mit der Änderungszeit einer Datei vergleichen können.

Ich merke es an der ATOM-Spezifikation, dass ATOM-Daten einen Zeitzonenversatz enthalten (Z<a number>), aber in meinem Fall gibt es nichts nach dem Z Ich denke also, wir können von GMT ausgehen.

Ich schätze, ich könnte die Zeit mit einer Art Regex analysieren, aber ich hatte gehofft, dass Python dafür eine integrierte Methode hätte, die ich einfach nicht finden konnte.

War es hilfreich?

Lösung

Nein builtin, afaik.

feed.date.rfc3339 Dies ist ein Python Bibliotheksmodul mit Funktionen für die Zeitstempel-Strings in RFC 3339-Format zu Python Zeit Gleitkommawerten Konvertieren und vice versa. RFC 3339 ist das Zeitstempel-Format von dem Atom-Feed Syndication-Format verwendet wird.

Es ist BSD-Lizenz.

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

(Edited so ist es klar, dass ich es nicht schreiben: -).

Andere Tipps

Sie sind nicht ein Beispiel, aber wenn Sie nicht über ein Z-Offset oder Zeitzone, und vorausgesetzt, Sie nicht Dauern wollen aber nur die Basiszeit, dann vielleicht wird dies zu Ihnen passen:

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)

Die strptime () Funktion auf das Datetime-Modul in Python 2.5 wurde hinzugefügt, so einige Leute noch nicht wissen, dass es da ist.

Bearbeiten : Die time.strptime () Funktion eine Zeit lang existiert hat aber, und Werke über die gleichen Sie einen struct_time Wert zu geben:

>>> 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/ scheint zu sein, iso 8601 Lage zu analysieren, die RFC 3339 ist eine Teilmenge von, vielleicht dies nützlich sein könnte, aber auch hier nicht eingebaut.

Ich hatte große Probleme mit dem RFC3339-Datums-/Uhrzeitformat, aber ich habe eine geeignete Lösung gefunden, um date_string <=> datetime_object in beide Richtungen zu konvertieren.

Sie benötigen zwei verschiedene externe Module, da eines davon die Konvertierung (leider) nur in eine Richtung durchführen kann:

Erstinstallation:

sudo pip install rfc3339
sudo pip install iso8601

dann einschließen:

import datetime     # for general datetime object handling
import rfc3339      # for date object -> date string
import iso8601      # for date string -> date object

Damit Sie sich nicht merken müssen, welches Modul für welche Richtung ist, habe ich zwei einfache Hilfsfunktionen geschrieben:

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

def get_date_string(date_object):
  return rfc3339.rfc3339(date_object)

was Sie in Ihrem Code ganz einfach wie folgt verwenden können:

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!Jetzt können Sie ganz einfach (Haha) verwenden Sie Ihre Datumszeichenfolgen und Datumszeichenfolgen in einem verwendbaren Format.

http://bugs.python.org/issue15873 (Duplikat von http://bugs.python.org/issue5207 )

Sieht aus wie es ist kein Einbau-als der noch.

feedparser.py bietet robuste / erweiterbarere verschiedene Datumsformate zu analysieren, die sein kann, begegnet in der realen Welt Atom / RSS-Feeds:

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

Wenn Sie Django verwenden, Sie Djangos Funktion 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>)

versuchen dies, es funktioniert gut für mich

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

oder

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

Mit Python 3 können Sie RegEx verwenden, um die RFC 3339 Zeitstempel in seine Bestandteile zu brechen. Dann direkt das Datetime-Objekt erstellen, keine zusätzliche Module benötigt:

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

In diesem Beispiel theads Zeitzonen oder Mikrosekunden als „0“ fehlt aber möglicherweise zusätzliche Fehlerprüfung benötigen. Cheers, Alex

kam über das ehrfürchtige dateutil.parser Modul in einer anderen Frage, und versuchte es auf meinem RFC3339 Problem, und es scheint, ich werfe mit mehr Verstand, dass eine der anderen Antworten auf diese Frage.

, um es zu haben alles im Griff
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top