Pregunta

¿Hay una manera fácil de convertir un rel="noreferrer"> RFC 3339 en una marca de tiempo regulares Python ?

Tengo un script que está leyendo un canal de información ATOM y me gustaría ser capaz de comparar la marca de tiempo de un elemento en el canal de información ATOM a la hora de modificación de un archivo.

Me he dado cuenta de la href="http://www.atomenabled.org/developers/syndication/atom-format-spec.php#date.constructs" especificación ATOM , que las fechas de ATOM incluyen un desplazamiento de zona horaria (Z<a number>), pero, en mi caso, no hay nada después de la Z así que supongo que podemos asumir GMT.

supongo que podría analizar el tiempo con una expresión regular de algún tipo, pero yo estaba esperando pitón tenía una forma integrada de hacerlo que simplemente no han sido capaces de encontrar.

¿Fue útil?

Solución

No incorporado, que yo sepa.

feed.date.rfc3339 Se trata de un módulo de la biblioteca de Python con funciones para convertir cadenas de fecha y hora en formato RFC 3339 a valores de coma flotante de tiempo Python, y viceversa. RFC 3339 es el formato de hora que utiliza el formato de sindicación Atom.

Se-licencia BSD.

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

(. Editado por lo que es claro que no he escrito que: -)

Otros consejos

No incluya un ejemplo, pero si usted no tiene un Z-offset o la zona horaria, y asumiendo que no desea duraciones, pero sólo el tiempo básico, entonces tal vez esto le conviene:

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 función strptime () se añadió al módulo de fecha y hora en Python 2.5 por lo que algunas personas aún no saben que está ahí.

Editar : El time.strptime () la función ha existido durante un tiempo, sin embargo, y trabaja sobre el mismo para darle un valor 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/ parece haber capaz de analizar la norma ISO 8601, que el RFC 3339 es un subconjunto de, tal vez esto podría ser útil, pero de nuevo, no incorporado.

Luché con formato de fecha y hora RFC3339 mucho, pero he encontrado una solución adecuada para convertir date_string <=> datetime_object en ambas direcciones.

Se necesitan dos módulos externos diferentes, ya que uno de ellos es sólo es capaz de hacer la conversión en una dirección (por desgracia):

primera instalación:

sudo pip install rfc3339
sudo pip install iso8601

entonces incluir:

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

Para no tener que recordar cuál es el módulo de la dirección, escribí dos funciones simples de ayuda:

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

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

, que dentro de su código que puede utilizar fácilmente como esto:

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! Ahora usted puede fácilmente ( jaja ) utilizan sus cadenas de fecha y cadenas de fecha en un formato utilizable.

http://bugs.python.org/issue15873 (duplicado de http://bugs.python.org/issue5207 )

Parece que no hay un built-in hasta el momento.

feedparser.py proporciona una forma extensible / robusta para analizar diversos formatos de fecha que pueden estar encontrado en un átomo del mundo real / 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)

Si estás usando Django, se puede utilizar la función de 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>)

probar esto, funciona bien para mí

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

El uso de Python 3, puede utilizar expresiones regulares para romper la marca de tiempo RFC 3339 en sus componentes. A continuación, crear directamente el objeto de fecha y hora, no hay módulos adicionales necesarios:

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

En este ejemplo se theads faltante zonas horarias o microsegundos como "0", pero puede ser que necesite la comprobación de errores adicionales. Cheers, Alex

scroll top