---
slug: "django-timezone-freezegun"
title: "freezegun を Django のテストで使う時、USE_TZ=True 環境下で1日後 にする方法"
description: "freezegun を Django テストで使うとき、`USE_TZ=True` の環境下で「1日後」「N時間後」のような相対時間を正しく扱う書き方。"
url: "https://www.ytyng.com/blog/django-timezone-freezegun"
publish_date: "2019-03-25T23:57:50Z"
created: "2019-03-25T23:57:50Z"
updated: "2026-05-11T13:11:12.824Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/59e0426e30124a90b3ef12d9d1d4f660.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# freezegun を Django のテストで使う時、USE_TZ=True 環境下で1日後 にする方法

reezegun は、python のライブラリ。

datetime での現在時刻取得をフックし、「翌日を想定したテスト」などができるようになる。

Django のテストで「翌日」を想定したテストをしたい場合、


```python
今日のログインボーナス()
with freezegun.freeze_time(datetime.timedelta(days=1)):
    明日のログインボーナス()
```

とすると、JSTタイムゾーンで開発している際に9:00 前にテストが失敗するなどの不具合が出る可能性がある。

```python
from django.utils import timezone

今日のログインボーナス()
with freezegun.freeze_time(timezone.now() + datetime.timedelta(days=1)):
    明日のログインボーナス()
```

としても同様。

freeze_time の引数には、UTC 以外の aware な datetime を入れた場合、
JSTタイムゾーンで開発している環境ではタイムゾーンが正しく処理されない。

正しく翌日判定させるには

```python
import datetime

今日のログインボーナス()
with freezegun.freeze_time(datetime.datetime.now() + datetime.timedelta(days=1)):
    明日のログインボーナス()
```

もしくは

```python
import datetime

今日のログインボーナス()
with freezegun.freeze_time(datetime.timedelta(days=1), tz_offset=9):
    明日のログインボーナス()
```

```python
import datetime
from django.utils import timezone
tz = timezone.get_current_timezone()


今日のログインボーナス()
with freezegun.freeze_time(datetime.timedelta(days=1), tz_offset=tz._utcoffset):
    明日のログインボーナス()
```

のようにする必要がある


## 汎用的に、aware な datetime を freeze_time するには

```python
aware_datetime = ...

with freezegun.freeze_time(
    aware_datetime, tz_offset=aware_datetime._utcoffset):
    ...
```
