django.utils.timezone.now()の挙動を整理

はじめに

  • Djangoで用意されているdjango.utils.timezone.now()の挙動はUSE_TZの設定によって挙動が変わる
  • 整理したいと思い、備忘録としてまとめておく

前提

本題

USE_TZ = Trueの時

  • 出力

      >>> from django.utils import timezone
      >>> print(timezone.now())
      2025-04-27 22:45:28.485428+00:00
    
    • TIME_ZONEの設定に関係ないUTCの時刻を返す

      USE_TZ が True の場合、 UTC の現在時刻を表す aware な日時になります。 now() は常に TIME_ZONE の値に関係なく UTC の時刻を返すことに注意してください

  • テンプレート
    • views.py

        from django.shortcuts import render
        from django.utils import timezone
      
        def timezone_test(request):
          now = timezone.now()
          return render(request, 'timezone.html', {'value': now})
      
    • timezone.html

        {% load tz %}
      
        <div>
          {% localtime on %}
            <p>localtime on {{ value }}</p>
          {% endlocaltime %}
      
          {% localtime off %}
          <p>localtime off {{ value }}</p>
          {% endlocaltime %}
      
          <p>{{ value }}</p>
        </div>
      
      • localtimeを使用することで、カレントタイムゾーン(設定されていなければ、デフォルトタイムゾーン)に変換して出力することができる
    • レンダリング
      • localtimeを使用することで、UTCの時刻からデフォルトのタイムゾーンに変換して出力される。
        • 注: activateを使用すると、デフォルトではなくカレントタイムゾーンが使用されるとのこと(参考)。

USE_TZ = Falseの時

  • 出力

      >>> from django.utils import timezone
      >>> timezone_now = timezone.now()
      >>> print(timezone_now)
      2025-04-28 07:14:47.608404
    
  • テンプレート
    • views.pyとtimezone.htmlは同じ
    • レンダリング localtimeの使用に関係なく常にローカルタイムが返されている

まとめ

USE_TZ timezone.now()の出力 テンプレートでの表示 備考
True UTC(aware) デフォルト or カレントタイムゾーン(変換) activate()に注意
False ローカルタイム(naive) そのまま表示(変換なし)

参考