{"title":"Fuseaux horaires","version":"3.0","locale":"fr","docname":"topics/i18n/timezones","url":"/fr/3.0/topics/i18n/timezones/","canonical":"https://djangodocs.dev/fr/3.0/topics/i18n/timezones/","summary":"Aperçu Lien vers cette rubrique # Lorsque la prise en charge des fuseaux horaires est activée, Django stocke les informations de date/heure en UTC dans la base de…","html":"<h1>Fuseaux horaires<a class=\"heading-anchor\" href=\"#time-zones\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"overview\">\n<span id=\"time-zones-overview\"></span><h2>Aperçu<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque la prise en charge des fuseaux horaires est activée, Django stocke les informations de date/heure en UTC dans la base de données, utilise en interne des objets date/heure conscients de leur fuseau horaire et les convertit dans les gabarits et les formulaires en utilisant le fuseau horaire de l’utilisateur.</p>\n<p>C’est très pratique si vos utilisateurs sont répartis sur plus d’un fuseau horaire et que vous vouliez afficher les informations temporelles selon l’heure locale de chacun.</p>\n<p>Même si votre site Web n’est utilisé que dans un seul fuseau horaire, stocker les données en UTC dans la base de données fait partie des bonnes pratiques. La  raison principale étant l’heure d’été (Daylight Saving Time - DST). Dans beaucoup de pays, l’heure d’été fait avancer d’une heure au printemps et reculer d’une heure en automne. Si vous travaillez en temps local, vous risquez d’obtenir des erreurs deux fois par année, au moment de la transition (la documentation de <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> aborde <a class=\"reference external\" href=\"http://pytz.sourceforge.net/#problems-with-localtime\">ces questions</a> plus en détails). ce n’est probablement pas un problème pour votre blog, mais c’en est un si vous surfacturez ou sous-facturez vos clients d’une heure, deux fois par année, chaque année. La solution à ce problème est d’utiliser UTC dans le code, et le temps local uniquement lors des interactions avec les utilisateurs du site.</p>\n<p>La prise en charge des fuseaux horaires est désactivée par défaut. Pour l’activer, définissez <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code></a> dans votre fichier de réglages. La prise en charge des fuseaux horaires utilise <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> qui est installé en même temps que Django.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le fichier <code class=\"file docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> créé par défaut par <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span></code></a> définit <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code></a> par commodité.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Il existe également un réglage différent mais lié nommé <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_L10N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_L10N</span></code></a> qui contrôle l’activation ou non des formats de régionalisation. Voir <a class=\"reference internal\" href=\"/fr/3.0/topics/i18n/formatting/\"><span class=\"doc\">Régionalisation des formats</span></a> pour plus de détails.</p>\n</aside>\n<p>Si vous êtes empêtré dans un problème particulier, commencez par lire la <a class=\"reference internal\" href=\"#time-zones-faq\"><span class=\"std std-ref\">FAQ des fuseaux horaires</span></a>.</p>\n</section>\n<section id=\"concepts\">\n<h2>Concepts<a class=\"heading-anchor\" href=\"#concepts\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"naive-and-aware-datetime-objects\">\n<span id=\"naive-vs-aware-datetimes\"></span><h3>Objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs et conscients<a class=\"heading-anchor\" href=\"#naive-and-aware-datetime-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les objets <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.datetime</span></code></a> de Python possèdent un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code> pouvant être utilisé pour stocker le fuseau horaire, représenté par une instance d’une sous-classe de <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.tzinfo\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.tzinfo</span></code></a>. Lorsque cet attribut est défini et qu’il décrit un décalage horaire, l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> est <strong>conscient</strong>. Dans le cas contraire, il est <strong>naïf</strong>.</p>\n<p>Vous pouvez utiliser  <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.is_aware\" title=\"django.utils.timezone.is_aware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">is_aware()</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.is_naive\" title=\"django.utils.timezone.is_naive\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">is_naive()</span></code></a> pour déterminer si les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> sont conscients (aware) ou naïfs.</p>\n<p>Lorsque la prise en charge des fuseaux horaires est désactivée, Django utilise des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs en heure locale. C’est suffisant dans de nombreux cas. Dans ce mode, pour obtenir le temps actuel, vous écririez :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n\n<span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Lorsque la prise en charge des fuseaux horaires est activée (<a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ=True</span></code></a>), Django utilise des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients de leur fuseau horaire. Si vote code crée des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>, ils devraient également être conscients. Dans ce mode, l’exemple ci-dessus devient :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n\n<span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>La manipulation des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients n’est pas toujours intuitive. Par exemple, le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code> du constructeur standard de <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> ne fonctionne pas de manière fiable pour les fuseaux horaires avec heure d’été. L’utilisation de l’heure UTC est généralement sûre ; si vous utilisez d’autres fuseaux horaires, vous devriez lire attentivement la documentation de <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a>.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Les objets <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.time</span></code></a> de Python comportent également un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code>, et PostgreSQL possède un type correspondant <code class=\"docutils literal notranslate\"><span class=\"pre\">time</span> <span class=\"pre\">with</span> <span class=\"pre\">time</span> <span class=\"pre\">zone</span></code> (heure avec fuseau horaire). Cependant, comme l’explique la documentation de PostgreSQL, ce type « prête des propriétés qui font douter de son utilité ».</p>\n<p>Django ne prend en charge que des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">time</span></code> naïfs et génère une exception si vous essayez d’enregistrer un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">time</span></code> conscient, dans la mesure où un fuseau horaire n’a pas de sens pour un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">time</span></code> sans date associée.</p>\n</aside>\n</section>\n<section id=\"interpretation-of-naive-datetime-objects\">\n<span id=\"naive-datetime-objects\"></span><h3>Interprétation des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs<a class=\"heading-anchor\" href=\"#interpretation-of-naive-datetime-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, Django accepte encore les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs, afin de préserver la rétrocompatibilité. Lorsque la couche base de données en reçoit un, elle essaie de le rendre conscient en l’interprétant dans le <a class=\"reference internal\" href=\"#default-current-time-zone\"><span class=\"std std-ref\">fuseau horaire par défaut</span></a> et génère un avertissement.</p>\n<p>Malheureusement, durant les transitions d’heure d’été, certains objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> n’existent pas ou sont ambigus. Dans de telles situations, <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> génère une exception. C’est pourquoi vous devriez toujours créer des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients lorsque la prise en charge des fuseaux horaires est activée.</p>\n<p>En pratique, c’est rarement un problème. Django produit des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients dans les modèles et les formulaires, et la plupart du temps, les nouveaux objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> sont créés à partir d’objets existants par des opérations <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">timedelta</span></code></a>. Le seul objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> qui est souvent créé dans du code applicatif est l’heure actuelle et <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.now\" title=\"django.utils.timezone.now\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">timezone.now()</span></code></a> fait automatiquement ce qu’il faut.</p>\n</section>\n<section id=\"default-time-zone-and-current-time-zone\">\n<span id=\"default-current-time-zone\"></span><h3>Fuseau horaire par défaut et fuseau horaire actuel<a class=\"heading-anchor\" href=\"#default-time-zone-and-current-time-zone\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le <strong>fuseau horaire par défaut</strong> est le fuseau horaire défini par le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a>.</p>\n<p>Le <strong>fuseau horaire actuel</strong> est le fuseau horaire utilisé pour l’affichage.</p>\n<p>Vous devriez définir le fuseau horaire actuel au fuseau horaire réel de l’utilisateur avec <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.activate\" title=\"django.utils.timezone.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">activate()</span></code></a>. Sinon, c’est le fuseau horaire par défaut qui est utilisé.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Comme expliqué dans la documentation de <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a>, Django définit des variables d’environnement afin que son processus tourne dans le fuseau horaire par défaut. Ce comportement est indépendant de la valeur de <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> et du fuseau horaire actuel.</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, ceci est utile pour préserver la rétrocompatibilité avec les applications qui se basent encore sur le temps local. Cepedant, <a class=\"reference internal\" href=\"#naive-datetime-objects\"><span class=\"std std-ref\">comme expliqué ci-dessus</span></a>, ce n’est pas totalement fiable et vous devriez toujours travailler avec des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients en UTC dans votre propre code. Par exemple, utilisez <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime.fromtimestamp\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">fromtimestamp()</span></code></a> et définissez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">tz</span></code> à <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.utc\" title=\"django.utils.timezone.utc\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">utc</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"selecting-the-current-time-zone\">\n<h3>Sélection du fuseau horaire actuel<a class=\"heading-anchor\" href=\"#selecting-the-current-time-zone\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le fuseau horaire actuel est l’équivalent de la  <a class=\"reference internal\" href=\"/fr/3.0/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">langue</span></a> actuelle pour les traductions. Cependant, il n’y a pas d’équivalent à l’en-tête HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Language</span></code> que Django pourrait utiliser pour déterminer automatiquement le fuseau horaire de l’utilisateur. Au lieu de cela, Django fournit des <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#time-zone-selection-functions\"><span class=\"std std-ref\">fonctions de sélection du fuseau horaire</span></a>. Utilisez-les pour bâtir une logique de sélection du fuseau horaire qui a du sens dans votre situation.</p>\n<p>La plupart des sites Web se préoccupant des fuseaux horaires demandent aux utilisateurs leur fuseau horaire de domicile et stockent cette information dans le profil des utilisateurs. Pour les utilisateurs anonymes, ils utilisent le fuseau horaire de la majorité de leur public ou l’heure UTC. <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> propose des <a class=\"reference external\" href=\"http://pytz.sourceforge.net/#helpers\">utilitaires</a>, comme une liste de fuseaux horaires par pays, qu’il est possible d’exploiter pour faire une présélection des choix les plus probables.</p>\n<p>Voici un exemple qui stocke le fuseau horaire actuel dans la session (la gestion d’erreur est totalement absente par simplicité).</p>\n<p>Ajoutez l’intergiciel suivant à <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">pytz</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TimezoneMiddleware</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">get_response</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"n\">tzname</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s1\">&#39;django_timezone&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">tzname</span><span class=\"p\">:</span>\n            <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">pytz</span><span class=\"o\">.</span><span class=\"n\">timezone</span><span class=\"p\">(</span><span class=\"n\">tzname</span><span class=\"p\">))</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">deactivate</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Créez une vue capable de définir le fuseau horaire actuel :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">redirect</span><span class=\"p\">,</span> <span class=\"n\">render</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">set_timezone</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"s1\">&#39;django_timezone&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s1\">&#39;timezone&#39;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">redirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;template.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;timezones&#39;</span><span class=\"p\">:</span> <span class=\"n\">pytz</span><span class=\"o\">.</span><span class=\"n\">common_timezones</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Ajoutez un formulaire dans <code class=\"docutils literal notranslate\"><span class=\"pre\">template.html</span></code> dont la cible <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> est cette vue :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_current_timezone</span> <span class=\"k\">as</span> <span class=\"nv\">TIME_ZONE</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">action</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;set_timezone&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;POST&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">csrf_token</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;timezone&quot;</span><span class=\"p\">&gt;</span>Time zone:<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">select</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;timezone&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">tz</span> <span class=\"k\">in</span> <span class=\"nv\">timezones</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">tz</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">tz</span> <span class=\"o\">==</span> <span class=\"nv\">TIME_ZONE</span> <span class=\"cp\">%}</span> <span class=\"na\">selected</span><span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">tz</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">select</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;Set&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"time-zone-aware-input-in-forms\">\n<span id=\"time-zones-in-forms\"></span><h2>Saisie de données avec fuseau horaire dans les formulaires<a class=\"heading-anchor\" href=\"#time-zone-aware-input-in-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque vous activez la prise en charge des fuseaux horaires, Django interprète les dates/heures saisies dans les formulaires dans le <a class=\"reference internal\" href=\"#default-current-time-zone\"><span class=\"std std-ref\">fuseau horaire actuel</span></a> et place des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients dans <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code>.</p>\n<p>Si le fuseau horaire actuel génère une exception pour les dates/heures qui n’existent pas ou qui sont ambiguës car elles se trouvent dans une transition d’heure d’été (les fuseaux horaires dans <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> le font), ces dates/heures seront signalées comme non valables.</p>\n</section>\n<section id=\"time-zone-aware-output-in-templates\">\n<span id=\"time-zones-in-templates\"></span><h2>Affichage de fuseaux horaires conscients dans les gabarits<a class=\"heading-anchor\" href=\"#time-zone-aware-output-in-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque vous activez la prise en charge des fuseaux horaires, Django convertit les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> dans le <a class=\"reference internal\" href=\"#default-current-time-zone\"><span class=\"std std-ref\">fuseau horaire actuel</span></a> au moment où ils sont affichés dans un gabarit. Ce comportement est très semblable à la <a class=\"reference internal\" href=\"/fr/3.0/topics/i18n/formatting/\"><span class=\"doc\">régionalisation des formats</span></a>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Django ne convertit pas les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs car ils peuvent être ambigus et parce que votre code ne doit jamais produire de tels objets naïfs lorsque la prise en charge des fuseaux horaires est activée. Cependant, vous pouvez forcer la conversion avec les filtres de gabarit décrits ci-dessous.</p>\n</aside>\n<p>La conversion en temps local n’est pas toujours adéquate, par exemple dans le cas où vous générez du contenu à destination d’autres ordinateurs. Les filtres et balises suivants, mis à disposition par la bibliothèque de balises de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">tz</span></code>, permettent de contrôler les conversions de fuseaux horaires.</p>\n<section id=\"template-tags\">\n<h3>Balises de gabarit<a class=\"heading-anchor\" href=\"#template-tags\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"localtime\">\n<span id=\"std-templatetag-localtime\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">localtime</span></code><a class=\"heading-anchor\" href=\"#localtime\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Active ou désactive la conversion d’objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients dans le fuseau horaire actuel à l’intérieur du bloc contenu.</p>\n<p>Cette balise a exactement le même effet que le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> en ce qui concerne le moteur de gabarits. Elle permet un contrôle plus précis des endroits où la conversion se fait.</p>\n<p>Pour activer ou désactiver la conversion pour un bloc de gabarit, utilisez :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">localtime</span> <span class=\"nv\">on</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">value</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endlocaltime</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">localtime</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">value</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endlocaltime</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>La valeur de <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> n’est pas prise en compte à l’intérieur d’un bloc <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">localtime</span> <span class=\"pre\">%}</span></code>.</p>\n</aside>\n</section>\n<section id=\"timezone\">\n<span id=\"std-templatetag-timezone\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">timezone</span></code><a class=\"heading-anchor\" href=\"#timezone\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Définit ou annule le fuseau horaire actuel dans le bloc contenu. Lorsque le fuseau horaire actuel est annulé, c’est le fuseau horaire par défaut qui s’applique.</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">timezone</span> <span class=\"s2\">&quot;Europe/Paris&quot;</span> <span class=\"cp\">%}</span>\n    Paris time: <span class=\"cp\">{{</span> <span class=\"nv\">value</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endtimezone</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">timezone</span> <span class=\"kp\">None</span> <span class=\"cp\">%}</span>\n    Server time: <span class=\"cp\">{{</span> <span class=\"nv\">value</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endtimezone</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"get-current-timezone\">\n<span id=\"std-templatetag-get_current_timezone\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_timezone</span></code><a class=\"heading-anchor\" href=\"#get-current-timezone\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Vous pouvez obtenir le nom du fuseau horaire actuel en utilisant la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_timezone</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_current_timezone</span> <span class=\"k\">as</span> <span class=\"nv\">TIME_ZONE</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Une alternative possible est d’activer le processeur de contexte <a class=\"reference internal\" href=\"/fr/3.0/ref/templates/api/#django.template.context_processors.tz\" title=\"django.template.context_processors.tz\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">tz()</span></code></a> et d’utiliser la variable de contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code>.</p>\n</section>\n</section>\n<section id=\"template-filters\">\n<h3>Filtres de gabarit<a class=\"heading-anchor\" href=\"#template-filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ces filtres acceptent aussi bien des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients que naïfs. À des fins de conversion, ils partent du principe que les objets naïfs sont dans le fuseau horaire par défaut. Ils renvoient toujours des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients.</p>\n<section id=\"std-templatefilter-localtime\">\n<span id=\"id1\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">localtime</span></code><a class=\"heading-anchor\" href=\"#std-templatefilter-localtime\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Force la conversion d’une valeur unique dans le fuseau horaire actuel.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{{</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">localtime</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</section>\n<section id=\"utc\">\n<span id=\"std-templatefilter-utc\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">utc</span></code><a class=\"heading-anchor\" href=\"#utc\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Force la conversion d’une seule valeur en UTC.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{{</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">utc</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</section>\n<section id=\"std-templatefilter-timezone\">\n<span id=\"id2\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">timezone</span></code><a class=\"heading-anchor\" href=\"#std-templatefilter-timezone\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Force la conversion d’une seule valeur dans un fuseau horaire arbitraire.</p>\n<p>Le paramètre doit être une instance d’une sous-classe de <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.tzinfo\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code></a> ou un nom de fuseau horaire.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{{</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">timezone</span><span class=\"s2\">:&quot;Europe/Paris&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"migration-guide\">\n<span id=\"time-zones-migration-guide\"></span><h2>Guide de migration<a class=\"heading-anchor\" href=\"#migration-guide\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Voici comment effectuer la migration d’un projet démarré avant que Django ne prenne en charge les fuseaux horaires.</p>\n<section id=\"database\">\n<h3>Base de données<a class=\"heading-anchor\" href=\"#database\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"postgresql\">\n<h4>PostgreSQL<a class=\"heading-anchor\" href=\"#postgresql\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Le moteur PostgreSQL stocke les dates/heures comme <code class=\"docutils literal notranslate\"><span class=\"pre\">timestamp</span> <span class=\"pre\">with</span> <span class=\"pre\">time</span> <span class=\"pre\">zone</span></code>. En pratique, cela signifie qu’il convertit les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> en UTC à partir du fuseau horaire de la connexion au moment du stockage, et à partir d’UTC vers le fuseau horaire de la connexion lors de la sélection.</p>\n<p>En conséquence, si vous utilisez PostgreSQL, vous pouvez librement passer de <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> et inversement. Le fuseau horaire de la connexion de la base de données sera défini respectivement à <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> et à <code class=\"docutils literal notranslate\"><span class=\"pre\">UTC</span></code>, ce qui fait que Django reçoit des dates/heures correctes dans tous les cas. Vous n’avez pas à convertir les données.</p>\n</section>\n<section id=\"other-databases\">\n<h4>Autres bases de données<a class=\"heading-anchor\" href=\"#other-databases\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les autres moteurs stockent les dates/heures sans information de fuseau horaire. Si vous passez de <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>, vous devez convertir vos données du temps local en UTC, ce qui n’est pas déterministe si votre temps local est sujet à l’heure d’été.</p>\n</section>\n</section>\n<section id=\"code\">\n<h3>Code<a class=\"heading-anchor\" href=\"#code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La première étape est d’ajouter <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code></a> à votre fichier de réglages. À ce stade, tout devrait fonctionner en principe. Si vous créez des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs dans votre code, Django les rend conscients en cas de besoin.</p>\n<p>Cependant, ces conversions peuvent échouer aux alentours des transitions d’heure d’été, ce qui signifie que vous n’obtenez pas encore tous les bénéfices de la prise en charge des fuseaux horaires. Il est également probable que vous rencontriez quelques problèmes car il est impossible de comparer une date/heure naïve avec une date/heure consciente. Comme Django vous donne maintenant des dates/heures conscientes, vous obtiendrez des exceptions chaque fois que vous comparez une date/heure provenant d’un modèle ou d’un formulaire avec une date/heure naïve que vous avez créée dans votre code.</p>\n<p>La seconde étape est donc de réviser votre code pour que chaque endroit où vous créer des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>, ceux-ci soient conscients. Cela peut se faire progressivement. <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#module-django.utils.timezone\" title=\"django.utils.timezone: Timezone support.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.timezone</span></code></a> définit quelques utilitaires bien pratiques pour du code compatible : <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.now\" title=\"django.utils.timezone.now\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">now()</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.is_aware\" title=\"django.utils.timezone.is_aware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">is_aware()</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.is_naive\" title=\"django.utils.timezone.is_naive\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">is_naive()</span></code></a>, <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.make_aware\" title=\"django.utils.timezone.make_aware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">make_aware()</span></code></a> et <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.make_naive\" title=\"django.utils.timezone.make_naive\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">make_naive()</span></code></a>.</p>\n<p>Finalement, pour vous aider à trouver le code qui a besoin d’être mis à jour, Django émet un avertissement lorsque vous essayez d’enregistrer une date/heure naïve dans la base de données :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"ne\">RuntimeWarning</span><span class=\"p\">:</span> <span class=\"n\">DateTimeField</span> <span class=\"n\">ModelName</span><span class=\"o\">.</span><span class=\"n\">field_name</span> <span class=\"n\">received</span> <span class=\"n\">a</span> <span class=\"n\">naive</span>\n<span class=\"n\">datetime</span> <span class=\"p\">(</span><span class=\"mi\">2012</span><span class=\"o\">-</span><span class=\"mi\">01</span><span class=\"o\">-</span><span class=\"mi\">01</span> <span class=\"mi\">00</span><span class=\"p\">:</span><span class=\"mi\">00</span><span class=\"p\">:</span><span class=\"mi\">00</span><span class=\"p\">)</span> <span class=\"k\">while</span> <span class=\"n\">time</span> <span class=\"n\">zone</span> <span class=\"n\">support</span> <span class=\"ow\">is</span> <span class=\"n\">active</span><span class=\"o\">.</span>\n</code></pre></div>\n<p>Durant le développement, vous pouvez transformer ces avertissements en exceptions et obtenir une trace d’appel en ajoutant ce qui suit dans votre fichier de réglages :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">warnings</span>\n<span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">filterwarnings</span><span class=\"p\">(</span>\n    <span class=\"s1\">&#39;error&#39;</span><span class=\"p\">,</span> <span class=\"sa\">r</span><span class=\"s2\">&quot;DateTimeField .* received a naive datetime&quot;</span><span class=\"p\">,</span>\n    <span class=\"ne\">RuntimeWarning</span><span class=\"p\">,</span> <span class=\"sa\">r</span><span class=\"s1\">&#39;django\\.db\\.models\\.fields&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"fixtures\">\n<h3>Instantanés<a class=\"heading-anchor\" href=\"#fixtures\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lors de la sérialisation d’une date/heure consciente, le décalage UTC est pris en compte, comme ceci :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"s2\">&quot;2011-09-01T13:20:30+03:00&quot;</span>\n</code></pre></div>\n<p>Alors que pour une date/heure naïve, ce n’est pas le cas :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"s2\">&quot;2011-09-01T13:20:30&quot;</span>\n</code></pre></div>\n<p>Pour les modèles comportant des champs <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a>, cette différence rend impossible l’écriture d’un instantané fonctionnant à la fois avec et sans prise en charge des fuseaux horaires.</p>\n<p>Les instantanés générés avec <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code> ou avant Django 1.4 utilisent le format « naïf ». Si votre projet contient de tels instantanés et que vous activez la prise en charge des fuseaux horaires, vous verrez des exceptions <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#RuntimeWarning\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">RuntimeWarning</span></code></a> lorsque vous les chargez. Pour vous débarrasser des ces avertissements, vous devez convertir vos instantanés au format « conscient ».</p>\n<p>Vous pouvez régénérer les instantanés avec <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-loaddata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">loaddata</span></code></a>, puis <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a>. Ou s’ils ne sont pas trop gros, vous pouvez les modifier et ajouter le décalage UTC correspondant à votre  <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> dans chaque objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> sérialisé.</p>\n</section>\n</section>\n<section id=\"faq\">\n<span id=\"time-zones-faq\"></span><h2>FAQ<a class=\"heading-anchor\" href=\"#faq\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"setup\">\n<h3>Configuration<a class=\"heading-anchor\" href=\"#setup\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p><strong>Je n’ai pas besoin de plusieurs fuseaux horaires. Dois-je activer la prise en charge des fuseaux horaires ?</strong></p>\n<p>Oui. Lorsque la prise en charge des fuseaux horaires est activée, Django utilise un modèle plus précis du temps local. Cela vous protège de bogues subtils et non reproductibles lors des transitions d’heure d’été (DST).</p>\n<p>Lorsque vous activez la prise en charge des fuseaux horaires, vous allez rencontrer certaines erreurs parce que vous utilisez des dates/heures naïves là où Django s’attend à des dates/heures conscientes. De telles erreurs apparaissent lors de l’exécution des tests. Vous apprendrez rapidement comment éviter les opérations non valides.</p>\n<p>D’un autre côté, les bogues qui proviennent d’une non prise en charge des fuseaux horaires sont beaucoup plus durs à prévenir, à diagnostiquer et à corriger. Tout ce qui touche aux tâches planifiées ou à l’arithmétique des dates/heures est sujet à de subtils bogues qui ne vous affecteront qu’une ou deux fois par année.</p>\n<p>C’est pour ces raisons que la prise en charge des fuseaux horaires est activée par défaut dans les nouveaux projets, et vous devriez garder ce réglage pour autant que vous n’ayez pas une bonne raison de ne pas le faire.</p>\n</li>\n<li><p><strong>J’ai activé la prise en charge des fuseaux horaires. Suis-je tranquille ?</strong></p>\n<p>Peut-être. Vous êtes mieux protégé des bogues liés à l’heure d’été, mais il est toujours possible que vous vous trompiez en convertissant sans précaution des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs en objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients et vice-versa.</p>\n<p>Si votre application se connecte à d’autres systèmes, par exemple si elle interroge un service Web, prenez soin de bien définir les dates/heures. Pour les transmettre de manière fiable, leur représentation doit inclure le décalage UTC ou leur valeur doit être en UTC (ou les deux !).</p>\n<p>Finalement, notre système de calendrier contient des pièges intéressants pour les ordinateurs :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">one_year_before</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>       <span class=\"c1\"># DON&#39;T DO THAT!</span>\n<span class=\"gp\">... </span>    <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"n\">year</span><span class=\"o\">=</span><span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">year</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">one_year_before</span><span class=\"p\">(</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"p\">(</span><span class=\"mi\">2012</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n<span class=\"go\">datetime.datetime(2011, 3, 1, 10, 0)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">one_year_before</span><span class=\"p\">(</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"p\">(</span><span class=\"mi\">2012</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">29</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValueError</span>: <span class=\"n\">day is out of range for month</span>\n</code></pre></div>\n<p>(Pour implémenter cette fonction, vous devez décider si 2012-02-29 moins une année est 2011-02-28 ou 2011-03-01, ce qui dépend de vos exigences métier)</p>\n</li>\n<li><p><strong>Comment interagir avec une base de données stockant les dates/heures en temps local ?</strong></p>\n<p>Définissez l’option <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-DATABASE-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> au fuseau horaire correspondant à cette base de données dans le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n<p>C’est utile pour se connecter à une base de données qui ne gère pas les fuseaux horaires et qui n’est pas gérée par Django lorsque <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</li>\n</ol>\n</section>\n<section id=\"troubleshooting\">\n<h3>Dépannage<a class=\"heading-anchor\" href=\"#troubleshooting\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p><strong>Mon application plante avec</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">TypeError:</span> <span class=\"pre\">can't</span> <span class=\"pre\">compare</span> <span class=\"pre\">offset-naive</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">and</span> <span class=\"pre\">offset-aware</span> <span class=\"pre\">datetimes</span></code> <strong>, qu’est-ce que je fais faux ?</strong></p>\n<p>Reproduisons cette erreur en comparant des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïf et conscient :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">naive</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">utcnow</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">aware</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">naive</span> <span class=\"o\">==</span> <span class=\"n\">aware</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">TypeError</span>: <span class=\"n\">can&#39;t compare offset-naive and offset-aware datetimes</span>\n</code></pre></div>\n<p>Si vous rencontrez cette erreur, il est très probable que votre code compare ces deux choses :</p>\n<ul class=\"simple\">\n<li><p>un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> fourni par Django, par exemple une valeur lue à partir d’un champ de formulaire ou d’un champ de modèle. Comme vous avez activé la prise en charge des fuseaux horaires, cet objet est conscient.</p></li>\n<li><p>un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> généré dans votre code de manière naïve (sinon vous ne liriez pas ceci).</p></li>\n</ul>\n<p>Généralement, la solution correcte est de modifier votre code pour qu’il utilise plutôt un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscient.</p>\n<p>Si vous écrivez une application réutilisable qui doit fonctionner indépendamment de la valeur de <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a>, il peut être utile d’appeler <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.now\" title=\"django.utils.timezone.now\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.timezone.now()</span></code></a>. Cette fonction renvoie la date et l’heure actuelle sous forme d’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïf lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code> et sous forme d’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscient lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>. Vous pouvez y ajouter ou soustraire une valeur <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.timedelta</span></code></a> selon vos besoins.</p>\n</li>\n<li><p><strong>Je vois beaucoup de</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">RuntimeWarning:</span> <span class=\"pre\">DateTimeField</span> <span class=\"pre\">received</span> <span class=\"pre\">a</span> <span class=\"pre\">naive</span> <span class=\"pre\">datetime</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">(YYYY-MM-DD</span> <span class=\"pre\">HH:MM:SS)</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">while</span> <span class=\"pre\">time</span> <span class=\"pre\">zone</span> <span class=\"pre\">support</span> <span class=\"pre\">is</span> <span class=\"pre\">active</span></code> <strong>, est-ce mauvais signe ?</strong></p>\n<p>Lorsque la prise en charge des fuseaux horaires est activée, la couche de base de données s’attend à ne recevoir que des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients de votre code. Cet avertissement se produit lorsqu’elle reçoit un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïf. Cela indique que vous n’avez pas terminé de transformer votre code pour la prise en charge des fuseaux horaires. Veuillez vous référer au <a class=\"reference internal\" href=\"#time-zones-migration-guide\"><span class=\"std std-ref\">guide de migration</span></a> pour des indications supplémentaires sur ce processus.</p>\n<p>Dans l’intervalle et par rétrocompatibilité, Django considère l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> comme se trouvant dans le fuseau horaire par défaut, ce qui correspond généralement à la réalité.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">now.date()</span></code> <strong>est hier ! (ou demain)</strong></p>\n<p>Si vous avez toujours utilisé des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> naïfs, vous pensez probablement pouvoir convertir un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> en objet <code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code> en appelant sa méthode <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime.date\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">date()</span></code></a>. Vous considérez également que <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">date</span></code></a> est très semblable à <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a>, avec moins de précision.</p>\n<p>Rien de cela n’est vrai dans un environnement conscient des fuseaux horaires :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">pytz</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">paris_tz</span> <span class=\"o\">=</span> <span class=\"n\">pytz</span><span class=\"o\">.</span><span class=\"n\">timezone</span><span class=\"p\">(</span><span class=\"s2\">&quot;Europe/Paris&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_york_tz</span> <span class=\"o\">=</span> <span class=\"n\">pytz</span><span class=\"o\">.</span><span class=\"n\">timezone</span><span class=\"p\">(</span><span class=\"s2\">&quot;America/New_York&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">paris</span> <span class=\"o\">=</span> <span class=\"n\">paris_tz</span><span class=\"o\">.</span><span class=\"n\">localize</span><span class=\"p\">(</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"p\">(</span><span class=\"mi\">2012</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">))</span>\n<span class=\"go\"># This is the correct way to convert between time zones with pytz.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_york</span> <span class=\"o\">=</span> <span class=\"n\">new_york_tz</span><span class=\"o\">.</span><span class=\"n\">normalize</span><span class=\"p\">(</span><span class=\"n\">paris</span><span class=\"o\">.</span><span class=\"n\">astimezone</span><span class=\"p\">(</span><span class=\"n\">new_york_tz</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">paris</span> <span class=\"o\">==</span> <span class=\"n\">new_york</span><span class=\"p\">,</span> <span class=\"n\">paris</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">()</span> <span class=\"o\">==</span> <span class=\"n\">new_york</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">()</span>\n<span class=\"go\">(True, False)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">paris</span> <span class=\"o\">-</span> <span class=\"n\">new_york</span><span class=\"p\">,</span> <span class=\"n\">paris</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">new_york</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">()</span>\n<span class=\"go\">(datetime.timedelta(0), datetime.timedelta(1))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">paris</span>\n<span class=\"go\">datetime.datetime(2012, 3, 3, 1, 30, tzinfo=&lt;DstTzInfo &#39;Europe/Paris&#39; CET+1:00:00 STD&gt;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_york</span>\n<span class=\"go\">datetime.datetime(2012, 3, 2, 19, 30, tzinfo=&lt;DstTzInfo &#39;America/New_York&#39; EST-1 day, 19:00:00 STD&gt;)</span>\n</code></pre></div>\n<p>Comme le montre cet exemple, le même objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> peut représenter une date différente selon le fuseau horaire dans lequel il est représenté. Mais le problème réel est plus fondamental.</p>\n<p>Un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> représente un <strong>point dans le temps</strong>. C’est absolu et cela ne dépend de rien d’autre. Au contraire, une date est un <strong>concept calendaire</strong>. Il s’agit d’une période de temps dont les limites dépendent du fuseau horaire dans lequel la date est considérée. Comme vous pouvez le voir, ces deux concepts sont fondamentalement différents et la conversion d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> en un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code> n’est pas une opération déterministe.</p>\n<p>Qu’est-ce que cela signifie en pratique ?</p>\n<p>Généralement, vous devriez éviter de convertir un objet <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a> en <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">date</span></code></a>. Par exemple, vous pouvez utiliser le filtre de gabarit <a class=\"reference internal\" href=\"/fr/3.0/ref/templates/builtins/#std-templatefilter-date\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">date</span></code></a> pour n’afficher que la partie date d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>. Ce filtre convertit l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> dans le fuseau horaire actuel avant de le mettre en forme, s’assurant ainsi que le résultat produit sera correct.</p>\n<p>Si vous avez réellement besoin d’effectuer vous-même la conversion, vous devez d’abord prendre soin de convertir l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> dans le fuseau horaire approprié. Il s’agit généralement du fuseau horaire actuel :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">pytz</span><span class=\"o\">.</span><span class=\"n\">timezone</span><span class=\"p\">(</span><span class=\"s2\">&quot;Asia/Singapore&quot;</span><span class=\"p\">))</span>\n<span class=\"go\"># For this example, we set the time zone to Singapore, but here&#39;s how</span>\n<span class=\"go\"># you would obtain the current time zone in the general case.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">current_tz</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">get_current_timezone</span><span class=\"p\">()</span>\n<span class=\"go\"># Again, this is the correct way to convert between time zones with pytz.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">local</span> <span class=\"o\">=</span> <span class=\"n\">current_tz</span><span class=\"o\">.</span><span class=\"n\">normalize</span><span class=\"p\">(</span><span class=\"n\">paris</span><span class=\"o\">.</span><span class=\"n\">astimezone</span><span class=\"p\">(</span><span class=\"n\">current_tz</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">local</span>\n<span class=\"go\">datetime.datetime(2012, 3, 3, 8, 30, tzinfo=&lt;DstTzInfo &#39;Asia/Singapore&#39; SGT+8:00:00 STD&gt;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">local</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">()</span>\n<span class=\"go\">datetime.date(2012, 3, 3)</span>\n</code></pre></div>\n</li>\n<li><p><strong>J’obtiens une erreur</strong> « <code class=\"docutils literal notranslate\"><span class=\"pre\">Are</span> <span class=\"pre\">time</span> <span class=\"pre\">zone</span> <span class=\"pre\">definitions</span> <span class=\"pre\">for</span> <span class=\"pre\">your</span> <span class=\"pre\">database</span> <span class=\"pre\">installed?</span></code> »</p>\n<p>Si vous utilisez MySQL, consultez la section <a class=\"reference internal\" href=\"/fr/3.0/ref/databases/#mysql-time-zone-definitions\"><span class=\"std std-ref\">Définitions de fuseaux horaires</span></a> des notes MySQL pour plus d’instructions sur le chargement des définitions de fuseaux horaires.</p>\n</li>\n</ol>\n</section>\n<section id=\"usage\">\n<h3>Utilisation<a class=\"heading-anchor\" href=\"#usage\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p><strong>J’ai une chaîne</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;2012-02-21</span> <span class=\"pre\">10:28:45&quot;</span></code> <strong>et je sais qu’elle est dans le fuseau horaire ** `` »Europe/Helsinki »``. Comment puis-je la transformer en un objet ``datetime`` conscient ?</strong></p>\n<p>C’est exactement le rôle de <a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a>.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.dateparse</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">parse_datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">naive</span> <span class=\"o\">=</span> <span class=\"n\">parse_datetime</span><span class=\"p\">(</span><span class=\"s2\">&quot;2012-02-21 10:28:45&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">pytz</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pytz</span><span class=\"o\">.</span><span class=\"n\">timezone</span><span class=\"p\">(</span><span class=\"s2\">&quot;Europe/Helsinki&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">localize</span><span class=\"p\">(</span><span class=\"n\">naive</span><span class=\"p\">,</span> <span class=\"n\">is_dst</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"go\">datetime.datetime(2012, 2, 21, 10, 28, 45, tzinfo=&lt;DstTzInfo &#39;Europe/Helsinki&#39; EET+2:00:00 STD&gt;)</span>\n</code></pre></div>\n<p>Notez que <code class=\"docutils literal notranslate\"><span class=\"pre\">localize</span></code> est une extension de pytz à l’API <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.tzinfo\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code></a>. Il peut être nécessaire d’intercepter les erreurs <code class=\"docutils literal notranslate\"><span class=\"pre\">pytz.InvalidTimeError</span></code>. La documentation de pytz contient <a class=\"reference external\" href=\"http://pytz.sourceforge.net/#example-usage\">davantage d’exemples</a>. Il est recommandé de la consulter avant d’essayer de manipuler des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients.</p>\n</li>\n<li><p><strong>Comment puis-je obtenir le temps local dans le fuseau horaire actuel ?</strong></p>\n<p>Et bien, la première question à se poser est : est-ce réellement nécessaire ?</p>\n<p>Le temps local ne doit être utilisé que lorsque l’on interagit avec des humains, et la couche des gabarits fournit des <a class=\"reference internal\" href=\"#time-zones-in-templates\"><span class=\"std std-ref\">filtres et des balises</span></a> pour convertir des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> dans le fuseau horaire de votre choix.</p>\n<p>De plus, Python sait comparer des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> conscients, en prenant en compte les décalages UTC si nécessaire. C’est beaucoup plus simple (et potentiellement plus rapide) d’écrire tout le code des modèles et des vues en UTC. Ainsi, dans la plupart des cas, l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> en UTC renvoyé par <a class=\"reference internal\" href=\"/fr/3.0/ref/utils/#django.utils.timezone.now\" title=\"django.utils.timezone.now\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.timezone.now()</span></code></a> sera suffisant.</p>\n<p>Par souci d’exhaustivité, si vous devez vraiment obtenir le temps local dans le fuseau horaire actuel, voici comment vous pouvez l’obtenir :</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">localtime</span><span class=\"p\">(</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span>\n<span class=\"go\">datetime.datetime(2012, 3, 3, 20, 10, 53, 873365, tzinfo=&lt;DstTzInfo &#39;Europe/Paris&#39; CET+1:00:00 STD&gt;)</span>\n</code></pre></div>\n<p>Dans cet exemple, le fuseau horaire actuel est <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Europe/Paris&quot;</span></code>.</p>\n</li>\n<li><p><strong>Comment puis-je voir tous les fuseaux horaires disponibles ?</strong></p>\n<p><a class=\"reference external\" href=\"http://pytz.sourceforge.net/\">pytz</a> fournit des <a class=\"reference external\" href=\"http://pytz.sourceforge.net/#helpers\">utilitaires</a>, y compris une liste des fuseaux horaires actuels et une liste de tous les fuseaux horaires disponibles, parmi lesquels se trouvent aussi certains qui n’ont qu’un intérêt historique.</p>\n</li>\n</ol>\n</section>\n</section>","rootId":"time-zones","toc":[{"title":"Aperçu","anchor":"overview","children":[]},{"title":"Concepts","anchor":"concepts","children":[{"title":"Objets datetime naïfs et conscients","anchor":"naive-and-aware-datetime-objects","children":[]},{"title":"Interprétation des objets datetime naïfs","anchor":"interpretation-of-naive-datetime-objects","children":[]},{"title":"Fuseau horaire par défaut et fuseau horaire actuel","anchor":"default-time-zone-and-current-time-zone","children":[]},{"title":"Sélection du fuseau horaire actuel","anchor":"selecting-the-current-time-zone","children":[]}]},{"title":"Saisie de données avec fuseau horaire dans les formulaires","anchor":"time-zone-aware-input-in-forms","children":[]},{"title":"Affichage de fuseaux horaires conscients dans les gabarits","anchor":"time-zone-aware-output-in-templates","children":[{"title":"Balises de gabarit","anchor":"template-tags","children":[{"title":"localtime","anchor":"localtime","children":[]},{"title":"timezone","anchor":"timezone","children":[]},{"title":"get_current_timezone","anchor":"get-current-timezone","children":[]}]},{"title":"Filtres de gabarit","anchor":"template-filters","children":[{"title":"localtime","anchor":"std-templatefilter-localtime","children":[]},{"title":"utc","anchor":"utc","children":[]},{"title":"timezone","anchor":"std-templatefilter-timezone","children":[]}]}]},{"title":"Guide de migration","anchor":"migration-guide","children":[{"title":"Base de données","anchor":"database","children":[{"title":"PostgreSQL","anchor":"postgresql","children":[]},{"title":"Autres bases de données","anchor":"other-databases","children":[]}]},{"title":"Code","anchor":"code","children":[]},{"title":"Instantanés","anchor":"fixtures","children":[]}]},{"title":"FAQ","anchor":"faq","children":[{"title":"Configuration","anchor":"setup","children":[]},{"title":"Dépannage","anchor":"troubleshooting","children":[]},{"title":"Utilisation","anchor":"usage","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/3.0/topics/"},{"docname":"topics/i18n/index","title":"Internationalisation et régionalisation","url":"/fr/3.0/topics/i18n/"}],"prev":{"docname":"topics/i18n/formatting","title":"Régionalisation des formats","url":"/fr/3.0/topics/i18n/formatting/"},"next":{"docname":"topics/logging","title":"Journalisation","url":"/fr/3.0/topics/logging/"},"formats":{"html":"/fr/3.0/topics/i18n/timezones/","markdown":"/fr/3.0/topics/i18n/timezones.md","json":"/fr/3.0/topics/i18n/timezones.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/topics/i18n/timezones.txt","official":"https://docs.djangoproject.com/fr/3.0/topics/i18n/timezones/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}