Timezone を意識していないと...
プログラムのメモリ空間
日本時間
ロンドン時間
Linux OS
(ワシントンD.C., US)
Time.now()
※紆余曲折あり、
混ざっている...
サーバー
時間
ずれてる
やん☠
09:00 (表記)
00:00 (表記)
20:00 (表記)
UTC +9
UTC +0
UTC -4
一度失われた offset
は絶対に分からない!
前日の...
Slide 16
Slide 16 text
あるべき理想(正規化)
プログラムのメモリ空間
日本時間
UTC 時間
Linux OS
(US, ワシントンD.C.)
Time.now()
offset付き時刻型
サーバー
時間
同じ基準✨
09:00+09:00
(ISO 8601)
00:00Z
(ISO 8601)
20:00-04:00
(ISO 8601)
Timeオブジェクト
(offset 付き)
Timeオブジェクト
(offset 付き)
Timeオブジェクト
(offset 付き)
Timeオブジェクト
(offset 付き)
API は ISO 8601
形式のみ
出入口で
必ず正規化
UTC +9
UTC +0
UTC -4
Slide 17
Slide 17 text
JSON API
{
"date": "2024/01/01",
"start": "10:00",
"end": "12:00"
}
{
"start": "2024-01-01T10:00:00+09:00",
"end": "2024-01-01T12:00:00+09:00"
}
API のリクエスト・レスポンスの日時パラメータは ISO 8601 に。
Slide 18
Slide 18 text
フロントコード
ISO 8601 表記の日時文字列であれば、何も考えずとも良い。
// 日本時間の朝 09:00.
jst = new Date("2024-01-01T09:00:00+09:00")
// 協定世界時 00:00.
utc = new Date("2024-01-01T00:00:00+00:00")
// false.
jst < utc
jst > utc.
// true.
jst.getTime() === utc.getTime()
Slide 19
Slide 19 text
フロントコード
オフセット表記がない場合は、ブラウザのロケールが尊重される。
// Mon Jan 01 2024 09:00:00 GMT+0900 (Japan Standard Time)
jst = new Date("2024/01/01 09:00:00")
// ==> 9
jst.getHours()
// ==> 0
jst.getUTCHours()
// true.
jst.getTime() === new Date("2024-01-01T09:00:00+09:00").getTime()
// false.
jst.getTime() === new Date("2024-01-01T09:00:00Z").getTime()
Slide 20
Slide 20 text
バックエンド (Ruby / Rails)
プログラムの出入口で即座に正規化をすること。
● 外界からの入力の直後に Time オブジェクト正規化する
○ e.g. APIリクエスト、標準入力、ファイル読み込み...
● 外界への出力の直前に ISO 8601 表記文字列に正規化する
○ e.g. API レスポンス、標準出力、ファイル書き出し
● DB から取り出した日時は ActiveSupport::TimeWithZone オブ
ジェクトになっている。Ruby 標準の Time オブジェクト互換
● 日時表現の文字列が出入口以外で存在しないこと!
jst = Time.zone.parse('2024-01-01T09:00:00+09:00')
utc = Time.zone.parse('2024-01-01T00:00:00+00:00')
// true.
jst == utc