Domanda

Esiste un modo semplice per convertire un file RFC3339 time in un normale timestamp Python?

Ho uno script che legge un feed ATOM e mi piacerebbe poter confrontare il timestamp di un elemento nel feed ATOM con l'ora di modifica di un file.

Noto dal Specifica ATOM, che le date ATOM includono una differenza di fuso orario (Z<a number>) ma, nel mio caso, non c'è niente dopo il Z quindi immagino che possiamo assumere GMT.

Suppongo di poter analizzare il tempo con una sorta di regex, ma speravo che Python avesse un modo integrato per farlo che non sono riuscito a trovare.

È stato utile?

Soluzione

No incorporato, per quanto ne so.

feed.date.rfc3339 Questo è un modulo libreria Python con funzioni per la conversione di stringhe in formato timestamp RFC 3339 per valori float tempo Python, e viceversa. RFC 3339 è il formato data e ora utilizzato dal formato di feed Atom syndication.

E 'BSD-licenza.

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

(. A cura in modo che sia chiaro Non ho scritto che: -)

Altri suggerimenti

non si include un esempio, ma se non si dispone di un Z-offset o fuso orario, e supponendo che non si vuole durate, ma solo il tempo di base, allora forse questo fa per voi:

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)

La funzione strptime () è stato aggiunto al modulo datetime in Python 2.5 per cui alcune persone ancora non sanno che è lì.

Modifica : Il time.strptime () la funzione esiste da un po ', però, e lavora circa lo stesso di dare un valore 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/ sembra essere in grado di analizzare ISO 8601, che RFC 3339 è un sottoinsieme di, forse questo potrebbe essere utile, ma ancora una volta, non è built-in.

Ho faticato molto con il formato datetime RFC3339, ma ho trovato una soluzione adatta per convertire date_string <=> datetime_object in entrambe le direzioni.

Sono necessari due diversi moduli esterni, perché uno di questi è in grado di eseguire la conversione solo in una direzione (purtroppo):

prima installazione:

sudo pip install rfc3339
sudo pip install iso8601

quindi includere:

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

Per non dover ricordare quale modulo è per quale direzione, ho scritto due semplici funzioni di supporto:

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

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

che all'interno del tuo codice puoi facilmente usare in questo modo:

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!Ora puoi facilmente (ahah) utilizza le stringhe di data e le stringhe di data in un formato utilizzabile.

http://bugs.python.org/issue15873 (duplicato di http://bugs.python.org/issue5207 )

Sembra che non v'è un built-in a partire da ancora.

feedparser.py fornisce robusta modo / estendibile per analizzare i vari formati di data che possono essere incontrato in atomo del mondo reale / 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)

Se stai usando Django, è possibile utilizzare la funzione di 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>)

provare questo, tutto funziona bene per me

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

o

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

Utilizzando Python 3, è possibile utilizzare RegEx per rompere il timestamp RFC 3339 nelle sue componenti. Quindi creare direttamente l'oggetto datetime, non moduli necessari ulteriori elementi:

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 questo esempio theads manca fusi orari o microsecondi come "0", ma potrebbero avere bisogno di ulteriore controllo degli errori. Cheers, Alex

scroll top