Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
DjangogirlsTutorialに出てくるtimezone.nowの秘密
Search
mizzsugar
November 16, 2019
Programming
390
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DjangogirlsTutorialに出てくるtimezone.nowの秘密
mizzsugar
November 16, 2019
More Decks by mizzsugar
See All by mizzsugar
自分のPCにPython環境を用意して_VSCodeでStreamlitアプリを動かすまでの8ステップ.pdf
mizzsugar
0
120
Colabのみで初心者向けPythonハンズオン.pdf
mizzsugar
0
93
厳しさとゆるさの間で迷う人に捧げる個人開発記
mizzsugar
0
76
SQLModel入門〜クエリと型〜
mizzsugar
3
1.6k
フルリモート向いてないと思っていた私が、なんだかんだ健やかに 1年半フルリモート出来ている話
mizzsugar
1
170
Djangoでのプロジェクトだって型ヒントを運用出来る!
mizzsugar
4
9.2k
「動くものは作れる」の一歩先へ 〜「自走プログラマー」の紹介〜
mizzsugar
0
660
pytestの第一歩 〜「テスト駆動Python」の紹介〜
mizzsugar
3
490
データ分析ツール開発でpoetryを使う選択肢
mizzsugar
1
1.2k
Other Decks in Programming
See All in Programming
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.3k
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
3.6k
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
220
Java 27新機能 / Java 27 new features
kishida
2
170
Workers Cache を知る
syumai
0
250
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
280
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
570
新卒PdEのリアル
ryu1013
1
520
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
670
SREの越境 / SRE Collaboration
y0hgi
2
280
すこし踏み込む CancellationToken
htkym
2
1.1k
Featured
See All Featured
HDC tutorial
michielstock
2
910
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
490
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Typedesign – Prime Four
hannesfritz
42
3.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Believing is Seeing
oripsolob
1
220
Git: the NoSQL Database
bkeepers
PRO
432
67k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
250
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The SEO identity crisis: Don't let AI make you average
varn
0
560
What's in a price? How to price your products and services
michaelherold
247
13k
Transcript
DjangogirlsTutorialに出てくる timezone.nowの秘密 2019/11/16 Djangogirls @mizzsugar0425
お前、誰よ • みずきと申します。 • やっていること↓ ◦ 昼:データ分析のデータ基盤のデータマネジメント (GCP: 特にBigQuery) ◦
夜:PythonでWebアプリ開発(Pyramid, PostgreSQL, Nuxt.js, TypeScript) ◦ つい最近まで仕事で Djagoいじってたので趣味で Django触ったりもします ◦ Twitter -> @mizzsugar0425 • コーヒーと自転車が好き
DjangogirlsTutorialの復習をしていたときのこと
しれっと使ってるdjango.utils.timezone.now from django.conf import settings from django.db import models from
django.utils import timezone class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) title = models.CharField(max_length=200) text = models.TextField() created_date = models.DateTimeField(default=timezone.now) published_date = models.DateTimeField(blank=True, null=True) def publish(self): self.published_date = timezone.now() self.save() https://tutorial.djangogirls.org/ja/django_models/ timezone.nowは 現在の日時を返すよ
なぜPython標準ライブラリの datetime.datetime.nowではないの? datetime.datetime.nowも 現在の日時を返すのに!!
秘密はここにあった! USE_TZ = True settings.py
USE_TZ=Trueだとタイムゾーンサポートが有効 今19時 だよー 今10時 だよー
タイムゾーンサポートがあるなら settings.pyで TIMEZONE = ‘Asia/Tokyo’と設定している場合・・・ • テンプレート上で日本時間を表示してくれて便利! • settings.pyのTIMEZONEを変更したらその場所の現地時間を表示 •
複数のタイムゾーンを使う場合、どのタイムゾーンの時間を表示するか設定す ればどのタイムゾーンの時間を表示するかそれぞれ振り分けてくれる※ ※公式ドキュメントにタイムゾーンを選択して表示するための実装例があります ↓ https://docs.djangoproject.com/ja/2.2/topics/i18n/timezones/#selecting-the-current-time-zone
内部ではどうなっているの? >>> from django.contrib.auth.models import User >>> from blog.models import
Post >>> >>> author = User.objects.create(username='dummy', email='
[email protected]
') >>> post = Post.objects.create( author=author, title='dummy', text='dummy' ) >>> post.publish() # 日本時間で2019/10/10 19:00:00に実行 >>> post.published_date datetime.datetime(2019, 10, 10, 10, 0, 0, tzinfo=<UTC>) 19時じゃない! UTCって!? を実行したら・・・ python manage.py shell
前提知識:nativeとawareという概念 ざっくりPythonでは 日時を扱うdatetimeモジュールのdatetimeオブジェクトを • タイムゾーンなしのdatetimeオブジェクトはnative ex: datetime.datetime(2019, 10, 10, 19,
0, 0) • タイムゾーンありのdatetimeオブジェクトはaware ex: datetime.datetime(2019, 10, 10, 19, 0, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>) と分けている もっと詳しい説明は公式ドキュメントで ↓ https://docs.python.org/ja/3/library/datetime.html#aware-and-naive-objects
UTCとは • 協定世界時(Coordinated Universal Time)のこと • 今の世界で標準時として使っている時間のこと • 日本の場合だと、世界の標準時間より9時間早い https://wa3.i-3-i.info/word11831.html
内部的な話 使う場所 表示形式 表示例 (日本時間2019/10/10 19時を例に) テンプレート・フォーム 現地時間(日本なら日本時間) テンプレート:2019年10月10日 19時0分0秒
フォーム: datetime.datetime(2019, 10, 10, 19, 0, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>) 内部の処理 UTC時間 datetime.datetime(2019, 10, 10, 10, 0, 0, tzinfo=<UTC>) データベース タイムゾーンなしの時間 (値としてはUTCでの時間) 2019-10-10 10:00:00 ※PostgreSQLだと 2019-10-10 10:00:00+00
1つのタイムゾーンでしか使わなくても • native -> awareに変換した際に意図しない値に変換してしまうバグを防げる • Djangoがawareなdatetimeオブジェクトを想定している処理でnativeなオブジェ クトを使うことによるバグを防げる • django-admin
startprojectコマンドで作られるプロジェクトでタイムゾーンサ ポートありになっていることからもタイムゾーンサポートありの方がいいと主張し ていることがうかがえる
datetime.datetime.nowの話に戻ると・・・ >>> from django.utils import timezone >>> import datetime >>>
>>> from django.utils import timezone >>> >>> # nativeなdatetimeオブジェクト >>> datetime.datetime.now() datetime.datetime(2019, 11, 12, 18, 0, 39, 452139) >>> >>> # タイムゾーンがUTCであるawareなdatetimeオブジェクト >>> timezone.now() datetime.datetime(2019, 11, 12, 9, 0, 46, 708708, tzinfo=<UTC>)
USE_TZ=Trueでnativeなオブジェクトを使うと RuntimeWarning: DateTimeField received a naive datetime * to while
time zone support is active. Djangoから「タイムゾーンサポートが有効な時にnativeなdatetimeオブジェク トを使わないでください」と注意されます。 エラーやワーニングは意地悪じゃなくて 安全なシステムを作るための優しさで 出来ているよ。
つまりdatetime.datetime.nowは使わない訳は タイムゾーンサポートが有効な設定をしているから 使っても動きはするけれども native -> awareの変換周りで苦労するやも
まとめ • Pythonのdatetimeオブジェクトにはnativeとawareという概念があり、前者 がタイムゾーンなしで後者がタイムゾーンありの日時(ざっくり) • Djangoではタイムゾーンサポートを有効にした方が安全 • タイムゾーンサポートを有効にした場合、Djangoでは内部的な処理ではタ イムゾーンがUTCの日時を使い、画面やフォームで現地時間に柔軟に変 換できるようにしている
• エラーやワーニングは意地悪じゃなくて優しさ
ありがとうございました!