Analyse D'une chaîne Datetime dans un champ Django DateTimeField

j'ai une application Django avec un modèle qui contient un champ de type DateTimeField.

Je suis de l'extraction de données à partir du web dans la forme 2008-04-10 11:47:58-05.

Je crois que les 3 derniers caractères dans cet exemple, le fuseau horaire.

Comment puis-je conserver ces données dans le champ DateTimeField, et y a-t-il une conversion facile entre les deux? Définir le champ DateTimeField pour simplement contenir une chaîne du format ci-dessus lance une ValidationError.

Merci vous!

25
demandé sur user1094786 2011-12-26 18:48:54
la source

4 ответов

Vous pouvez utiliser

import dateutil.parser
dateutil.parser.parse('2008-04-10 11:47:58-05')

qui renvoie une datetime (qui peut être assignée au champ DateTimeField).

36
répondu nisc 2011-12-26 22:14:28
la source

vous pouvez aussi utiliser Django mise en œuvre. En fait, je le préférerais et n'utiliserais que quelque chose d'autre, si L'analyseur de Django ne peut pas gérer le format.

Par exemple:

>>> from django.utils.dateparse import parse_datetime
>>> parse_datetime('2016-10-03T19:00:00')
datetime.datetime(2016, 10, 3, 19, 0)
>>> parse_datetime('2016-10-03T19:00:00+0200')
datetime.datetime(2016, 10, 3, 19, 0, tzinfo=<django.utils.timezone.FixedOffset object at 0x8072546d8>)

pour le faire convertir au bon fuseau horaire quand aucun n'est connu, utilisez make_aware de django.utils.timezone.

donc finalement, votre parser utility serait:

from django.utils.dateparse import parse_datetime
from django.utils.timezone import is_aware, make_aware

def get_aware_datetime(date_str):
    ret = parse_datetime(date_str)
    if not is_aware(ret):
        ret = make_aware(ret)
    return ret
49
répondu Melvyn 2016-09-23 16:03:03
la source

j'ai utilisé ceci:

from django.utils.timezone import get_current_timezone
from datetime import datetime
tz = get_current_timezone()
dt = tz.localize(datetime.strptime(str_date, '%m/%d/%Y'))
7
répondu Paul Tomblin 2014-07-14 19:36:09
la source

si vous utilisez des formulaires Django, vous pouvez spécifier input_formats pour votre DateField. Voir le DateField documentation

si vous voulez discuter arbitraires renseignements sur la date, vous pouvez utiliser quelque chose comme parsedatetime et implémenter une méthode que Django appelle pour faire l'analyse avant qu'elle ne touche les validateurs. (Voirceci AFIN de répondre à pour un bon résumé de la façon dont les validations de travail et lorsque les insérer)

3
répondu RyanWilcox 2017-05-23 15:26:32
la source

Autres questions sur