40 votes

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.
J'extrait des données du web dans le format 2008-04-10 11:47:58-05.
Je crois que les 3 derniers caractères de cet exemple sont 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 qu'il contienne simplement une chaîne du format ci-dessus lance une ValidationError.

Merci ! Merci !

92voto

Melvyn Points 3920

Vous pouvez également utiliser l'implémentation de Django. Je préférerais en fait cela et n'utiliser 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 convertir au bon fuseau horaire lorsqu'aucun n'est connu, utilisez make_aware django.utils.timezone.

Donc, en fin de compte, votre utilitaire d'analyseur 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

55voto

nisc Points 1182

Vous pouvez utiliser

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

Qui renvoie une date-heure (qui peut être affectée au champ DateTimeField).

16voto

Paul Tomblin Points 83687

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

2voto

RameshD Points 331

Le format de chaîne de Django DateTimeField est "%Y- % m-%dT%H :%M :%S.%fZ". Par conséquent, la conversion entre les autres peut être effectuée en utilisant strptime() ou strptime() en utilisant ce format.

par exemple, pour la valeur formatée de chaîne (2016-10-03T19:00: 00.999Z), il peut être converti en objet datetime Django en tant que :

from datetime import datetime

datetime_str = '2016-10-03T19:00:00.999Z'

datetime_object = datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%S.%fZ")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X