Pergunta

Existe uma maneira fácil de converter um RFC 3339 Tempo em um registro de data e hora regular de Python?

Eu tenho um script que está lendo um feed de átomo e gostaria de comparar o registro de data e hora de um item no feed do Atom com o tempo de modificação de um arquivo.

Eu noto do Spec, que as datas do átomo incluem um deslocamento de fuso horário (Z<a number>) Mas, no meu caso, não há nada depois do Z Então, acho que podemos assumir o GMT.

Suponho que poderia analisar o tempo com algum tipo de regex, mas esperava que o Python tivesse uma maneira embutida de fazê-lo que eu simplesmente não consegui encontrar.

Foi útil?

Solução

Sem embutido, Afaik.

feed.date.rfc3339Este é um módulo de biblioteca Python com funções para converter strings de registro de data e hora no formato RFC 3339 em valores de flutuação do tempo do Python e vice -versa. RFC 3339 é o formato de registro de data e hora usado pelo formato de sindicação de alimentação do Atom.

É licenciado por BSD.

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

(Editado para que fique claro que não escrevi. :-)

Outras dicas

Você não inclui um exemplo, mas se você não tiver um zone Z ou fuso horário e assumindo que não deseja durações, mas apenas a hora básica, talvez isso seja adequado para você:

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)

A função strptime () foi adicionada ao módulo DateTime no Python 2.5, para que algumas pessoas ainda não sabem que está lá.

Editar: A função the time.strptime () existe há algum tempo e funciona sobre o mesmo para fornecer um valor de 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 ser capaz de analisar a ISO 8601, que a RFC 3339 é um subconjunto de, talvez isso possa ser útil, mas novamente, não embutido.

Eu lutei muito com o formato RFC3339 DateTime, mas encontrei uma solução adequada para converter Date_string <=> DATETime_Object em ambas as direções.

Você precisa de dois módulos externos diferentes, porque um deles é capaz de fazer a conversão em uma direção (infelizmente):

Primeira instalação:

sudo pip install rfc3339
sudo pip install iso8601

Em seguida, inclua:

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

Por não precisar lembrar qual módulo é para qual direção escrevi duas funções simples auxiliares:

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

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

Qual dentro do seu código você pode usar facilmente assim:

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! Agora você pode facilmente (haha) Use suas seqüências de dados e seqüências de data em um formato utilizável.

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

Parece que ainda não há um embutido.

feedparser.py Fornece maneira robusta/extensível para analisar vários formatos de data que podem ser encontrados em feeds Atom/RSS do mundo real:

>>> 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 você está usando o Django, você pode usar a função 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>)

tente isso, funciona bem para mim

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

ou

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

Usando o Python 3, você pode usar o REGEX para quebrar o registro de data e hora do RFC 3339 em seus componentes. Em seguida, crie diretamente o objeto DateTime, nenhum módulo adicional necessário:

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

Este exemplo tem que ausente fusos horários ou microssegundos como "0", mas pode precisar de verificação adicional de erros. Saúde, Alex

Me deparou com o incrível dateUtil.Parser módulo em outra pergunta e tentou no meu problema de RFC3339, e parece lidar com tudo o que ligo com mais sanidade que qualquer uma das outras respostas nesta pergunta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top