Slide 1

Slide 1 text

Goの日時書式の話 2025.05 開発定例LT 蜂谷

Slide 2

Slide 2 text

Goの日時書式って特殊ですよね 2006-01-02 15:04:05

Slide 3

Slide 3 text

Goの日時書式は批判されがち https://ytyaru.hatenablog.com/entry/2022/10/31/000000

Slide 4

Slide 4 text

こうなっている理由はちゃんとある アメリカの慣例(Jan 1st 12:34:56 とか)に倣って `月-日 時:分:秒 年` の形式で 先頭から1,2,3…と番号を付けている。 分は12時間表記が `3` で24時間表記は `15`

Slide 5

Slide 5 text

ただし年月日の並び順の方が世界的に広く使われている 世界的に `年月日` の並びの方が広く使われていることを Go言語開発者のRob Pikeが知らなかったのでこの並びになった。 この仕様は誤りだったとメーリングリストで語ったらしい。 後方互換維持のため Go 1.x の間はこのまま

Slide 6

Slide 6 text

アルファベットで表す形式の方が他の言語には多い - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss

Slide 7

Slide 7 text

同じような書式が多いので経験が増えるほど迷う - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss %つけるんだっけ?

Slide 8

Slide 8 text

同じような書式が多いので経験が増えるほど迷う - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 月と分のmは大文字小文 字どっちだっけ?

Slide 9

Slide 9 text

同じような書式が多いので経験が増えるほど迷う - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 時は24ありだっけ?

Slide 10

Slide 10 text

同じような書式が多いので経験が増えるほど迷う - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 全体的に大文字小文字 どっちだっけ?

Slide 11

Slide 11 text

パターンが多いと辿り着くまで大変 - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 辿り着くまでに考えること 1. 年が4文字のパターン? 2. %つくパターン? 3. 時は24つく? 4. 分はiかmか?それともmi? 5. 大文字小文字どうだっけ?

Slide 12

Slide 12 text

パターンが多いと辿り着くまで大変 - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 辿り着くまでに考えること 1. 年が4文字のパターン? 2. %つくパターン? 3. 時は24つく? <- 全てのステップで?がつく 4. 分はiかmか?それともmi? 5. 大文字小文字どうだっけ?

Slide 13

Slide 13 text

パターンが多いと辿り着くまで大変 - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 辿り着くまでに考えること 1. 年が4文字のパターン? <- 実際はここの?で諦めてリファレンスをみる 2. %つくパターン? 3. 時は24つく? <- 全てのステップで?がつく 4. 分はiかmか?それともmi? 5. 大文字小文字どうだっけ?

Slide 14

Slide 14 text

パターンが多いと辿り着くまで大変 - PHP: Y-m-d H:i:s - MySQL: %Y-%m-%d %H:%i:%s - C: %Y-%m-%d %H:%M:%S - PostgreSQL: YYYY-MM-DD HH24:MI:SS - JavaScript: YYYY-MM-DD HH:mm:ss - SQLServer: yyyy-MM-dd HH:mm:ss 辿り着くまでに考えること 1. 年が4文字のパターン? 2. %つくパターン? <- この辺で考えるのを諦めてリファレンスをみる 3. 時は24つく? <- 全てのステップで?がつく 4. 分はiかmか?それともmi? 5. 大文字小文字どうだっけ? よく使われる設計だから使いやすいわけではない 同じような設計が増えると微妙な違いが増える

Slide 15

Slide 15 text

Goの日時書式はルールを覚えれば迷わない 2006-01-02 15:04:05 辿り着くまでに考えること 1. 数字を並べればOK 2. 月日時分秒年 の順で1から6まで 3. 時分秒をゼロ埋めするなら0をつけて2桁にする 4. 年は4桁で2006固定でOK 5. 時は24時間表示なら午後3時の15

Slide 16

Slide 16 text

Goの日時書式はルールを覚えれば迷わない 2006-01-02 15:04:05 辿り着くまでに考えること 1. 数字を並べればOK 2. 月日時分秒年 の順で1から6まで 3. ゼロ埋めするなら0をつけて2桁にする 4. 年は4桁で2006固定でOK 5. 時は24時間表示なら午後3時の15 ユニークかつルールが明確なので迷わない 万が一このパターンが増えてしまうと迷うようになる

Slide 17

Slide 17 text

標準ライブラリにいろんなパターンが定数定義されてます https://pkg.go.dev/time#pkg-constants

Slide 18

Slide 18 text

まとめ - Goの日時書式は一見変だけどちゃんと考えられているよ - よく使われるパターンは似たパターンが多いとむしろわかりづらくなる - 見慣れないからといって拒絶するのではなくなぜそうなのか調べると良い - 一貫した設計思想に基づいて実装ルールを徹底するのは認知負荷を下げる

Slide 19

Slide 19 text

おわり 以上です