Question

Existe-t-il un moyen simple de convertir un RFC3339 l'heure dans un horodatage Python normal ?

J'ai un script qui lit un flux ATOM et j'aimerais pouvoir comparer l'horodatage d'un élément du flux ATOM à l'heure de modification d'un fichier.

Je remarque du Spécification ATOM, que les dates ATOM incluent un décalage de fuseau horaire (Z<a number>) mais, dans mon cas, il n'y a rien après le Z donc je suppose que nous pouvons supposer GMT.

Je suppose que je pourrais analyser l'heure avec une sorte d'expression régulière, mais j'espérais que Python avait un moyen intégré de le faire que je n'ai tout simplement pas pu trouver.

Était-ce utile?

La solution

Non builtin, autant que je sache.

feed.date.rfc3339 Ce module bibliothèque Python avec des fonctions pour convertir des chaînes d'horodatage au format RFC 3339 aux valeurs flottantes de temps Python, et vice versa. RFC 3339 est le format d'horodatage utilisé par le format de syndication de flux Atom.

Il est sous licence BSD.

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

(. Edité il est clair que je ne l'ai pas l'écrire: -)

Autres conseils

Vous n'incluez pas un exemple, mais si vous ne disposez pas d'un décalage Z ou le fuseau horaire, et en supposant que vous ne voulez pas la durée, mais juste le temps de base, alors peut-être cela vous conviendra:

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 fonction strptime () a été ajoutée au module datetime en Python 2.5 de sorte que certaines personnes ne le savent pas encore est là.

Modifier : La fonction time.strptime () existe depuis un certain temps cependant, et fonctionne sur le même pour vous donner une valeur 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/ semble être capable d'analyser ISO 8601, qui RFC 3339 est un sous-ensemble, peut-être cela pourrait être utile, mais encore une fois, non intégré.

J'ai beaucoup eu du mal avec le format datetime RFC3339, mais j'ai trouvé une solution appropriée pour convertir date_string <=> datetime_object dans les deux sens.

Vous avez besoin de deux modules externes différents, car l'un d'eux n'est capable d'effectuer la conversion que dans un sens (malheureusement) :

première installation :

sudo pip install rfc3339
sudo pip install iso8601

puis incluez :

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

Pour ne pas avoir besoin de me rappeler quel module correspond à quelle direction, j'ai écrit deux fonctions d'assistance simples :

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

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

que vous pouvez facilement utiliser dans votre code comme ceci :

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 !Maintenant, vous pouvez facilement (haha) utilisez vos chaînes de date et vos chaînes de date dans un format utilisable.

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

On dirait qu'il n'y a pas intégré pour l'instant.

feedparser.py fournit la manière robuste / extensible pour analyser différents formats de date qui peuvent être rencontré dans le monde réel atome / flux 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 vous utilisez Django, vous pouvez utiliser la fonction 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>)

essayer, cela fonctionne très bien pour moi

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

En utilisant Python 3, vous pouvez utiliser RegEx pour briser l'horodatage RFC 3339 dans ses composants. Ensuite, créez directement l'objet datetime, pas de modules supplémentaires nécessaires:

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

Cet exemple theads manquant ou timezones microsecondes que « 0 », mais peut-être besoin de vérification des erreurs supplémentaires. Cheers, Alex

Entré dans le module impressionnant dateutil.parser dans une autre question, et a essayé sur mon problème de RFC3339, et il semble pour gérer tout ce que je jette à lui avec plus bon sens que l'une des autres réponses à cette question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top