web-dev-qa-db-fra.com

Django: Comment rendre un objet datetime conscient du fuseau horaire dans lequel il a été créé?

J'exécute un programme qui demande des données sur les marées océaniques à un serveur distant. Les time et date de ces données de marée sont calculées en fonction du fuseau horaire local de ma machine. Je veux utiliser ces dates et heures locales pour créer un objet datetime, que je sauvegarderai ensuite dans un modèle Django.

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)

Comment puis-je m'assurer que l'objet datetime sait qu'il a été créé sur la base d'un fuseau horaire local, avant de le publier sur Django?

Je suppose que je voudrais qu'il ressemble à ceci avant de le poster:

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute, loc_timezone)

Comment obtenir dynamiquement le fuseau horaire local de ma machine? Et comment m'assurer que tous les utilisateurs voient l'heure convertie dans leur propre fuseau horaire local.

20
sgarza62

Tout d'abord, assurez-vous que vous êtes familier avec Django documentation sur les fuseaux horaires , définissez USE_TZ = True Et installez pytz.

Je ne comprends pas très bien d'où vient votre date. Si cela vient du serveur dans le cadre de leurs données (c'est-à-dire qu'il représente le moment où les marées ont été mesurées), il devrait déjà être en UTC ou vous devrez connaître le fuseau horaire qu'ils utilisent. Si vous le créez, la chose la plus simple consiste simplement à utiliser Django.utils.timezone.now() (qui retourne un datetime sensible au fuseau horaire) lorsque vous créez votre instance de modèle.

Si vous avez vraiment besoin de le créer manuellement comme vous l'avez décrit, suivez l'utilisation ici ou utilisez make_aware() :

from Django.utils.timezone import make_aware

naive = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
make_aware(naive)  # current timezone, or...
make_aware(naive, timezone=pytz.timezone("Europe/Helsinki"))  # ...specific timezone

Le fuseau horaire actuel sera le fuseau horaire par défaut (tel que défini par le paramètre TIME_ZONE ) sauf si vous avez utilisé activate() pour en spécifier un autre. Le fuseau horaire par défaut peut être identique ou non au fuseau horaire du système du serveur. Obtenir le fuseau horaire du système dans un format que pytz peut comprendre est expliqué dans cette réponse .

Enfin, s'assurer que les utilisateurs voient l'heure convertie dans leur fuseau horaire local n'est pas anodin, comme indiqué ici :

Le fuseau horaire actuel est l'équivalent des paramètres régionaux actuels pour les traductions. Cependant, il n'y a pas d'équivalent de l'en-tête HTTP Accept-Language que Django pourrait utiliser pour déterminer automatiquement le fuseau horaire de l'utilisateur. Au lieu de cela, Django fournit des fonctions de sélection de fuseau horaire Utilisez-les pour créer la logique de sélection de fuseau horaire qui vous convient.

Voir les exemples là pour des conseils.

from Django.utils import timezone
import pytz

timezone.activate(pytz.timezone("Asia/Kolkata"))
timezone.localtime(timezone.now())
5
HimalayanCoder