Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ISO8601/2020-12-23-llt18
Search
Satoshi SAKAO
December 23, 2020
Programming
0
200
ISO8601/2020-12-23-llt18
社内のLTイベント「えるLT Vol.18 オンライン」で発表した資料です
Satoshi SAKAO
December 23, 2020
Tweet
Share
More Decks by Satoshi SAKAO
See All by Satoshi SAKAO
Testcontainers/2024-11-20-llt32
ottijp
0
46
Pkl/2024-04-17-llt31
ottijp
0
77
JavaScriptのデバッグ/2023-09-04-llt30
ottijp
0
150
CDK for TerraformでAzureリソースをデプロイする/2023-05-15-llt29
ottijp
1
250
TWELITEへの誘い/2022-12-27-llt28
ottijp
0
150
ビルドツールBazelを触ってみた/2022-09-28-llt27
ottijp
0
150
HashiCorp Vaultを使ったシークレットのセキュアな一元管理 〜Ansibleを添えて〜/2022-07-12-llt26
ottijp
0
140
AWSインフラのデプロイをCDKでカイゼンする/2022-03-23-llt25
ottijp
0
82
Amazon Timestreamでデータ補間/2021-12-27-llt24
ottijp
0
98
Other Decks in Programming
See All in Programming
型安全なDrag and Dropの設計を考える
yudppp
5
660
FastMCPでMCPサーバー/クライアントを構築してみる
ttnyt8701
2
100
抽象データ型について学んだ
ryounasso
0
210
💎 My RubyKaigi Effect in 2025: Top Ruby Companies 🌐
yasulab
PRO
1
130
がんばりすぎないコーディングルール運用術
tsukakei
1
190
衛星の軌道をWeb地図上に表示する
sankichi92
0
250
Feature Flag 自動お掃除のための TypeScript プログラム変換
azrsh
PRO
4
630
RubyKaigiで得られる10の価値 〜Ruby話を聞くことだけが RubyKaigiじゃない〜
tomohiko9090
0
110
Babylon.js 8.0のアプデ情報を 軽率にキャッチアップ / catch-up-babylonjs-8
drumath2237
0
110
SpringBootにおけるオブザーバビリティのなにか
irof
1
890
JVM の仕組みを理解して PHP で実装してみよう
m3m0r7
PRO
1
250
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
110
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
42
2.3k
Stop Working from a Prison Cell
hatefulcrawdad
269
20k
Side Projects
sachag
454
42k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Six Lessons from altMBA
skipperchong
28
3.8k
Faster Mobile Websites
deanohume
307
31k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Docker and Python
trallard
44
3.4k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Transcript
ISO 8601 Satoshi SAKAO えるLT Vol.18 2020-12-23T20:00:00 1 情報交換のための 日時の文字列表現
話すひと 2 インフォコム株式会社 品質マネジメント推進室 ソフトウェアエンジニア JS (ES6) / Node.js /
GCP / IoT / iOS (Swift) 猫, @lowcostcosplayth Satoshi SAKAO @ottijp
ISO 8601とは • 情報交換のための,日付や時刻の文字列表現に関する標準 • Example • 日本時間(JST) 2020年12月23日20時0分0秒 •
2020-12-23T20:00:00+09:00 • オレオレ設計する前に,考えの起点にするのがよさそう 3 ISO 8601 format
標準化の対象 • 日付 • 時刻(と時差) • 日時 • 時間間隔 •
反復時間間隔 4 2020-12-23 20:00:00+09:00 2020-12-23T20:00:00+09:00 P1DT12H R4/2020-12-23T20:00:00/P20H Example
記法 • 基本形式と拡張形式 • 基本形式: 20201223200000 • 拡張形式: 2020-12-23T20:00:00 •
完全表記と省略表記 • 完全表記: 2020-12-23 (2020年12月23日) • 上位省略: --12-23 (ある年の月日) • 下位省略: 2020-12 (特定の月) • 代用形式 • 拡大表記 5 TODAY TODAY
日付 • 暦日付(年月日): 2020-12-23 • 年間通算日(年と年日): 2020-358 • 暦週日付(年と年週と週日): 2020-W52-3
6
時刻 • 地方時: 20:00:00 • UTC時: 11:00:00Z • 時差の表記: 20:00:00+09:00
• 小数表記 • 20.5 (20時30分00秒) • 20:10.5 (20時10分30秒) • 20:20:40.5 (20時20分40.5秒) 7
日時 • 2020-12-23T20:00:00 • 2020-358T20:00:00 • 2020-W52-3T20:00:00 • 2020-12-23T20:00:00+09:00 •
2020-12-23T11:00:00Z 8
時間間隔 • 経過時間 • P2Y1MT30.5M (2年1ヶ月30分30秒) • 始点と終点 • 2020-12-23T20:00:00/2020-12-24T00:00:00
(2020年12月23日20時0分0秒から2020年12月24日0時0分0秒) • 始点と経過時間 • 2020-12-23T20:00:00/P2H (2020年12月23日20時0分0秒から2時間) • 経過時間と終点 • PT30M/2020-12-23T20:00:00 (2020年12月23日20時0分0秒までの30分) 9
反復時間間隔 • 反復回数+経過時間 • R3/P1W (1週間を3回) • 反復回数+始点と終点 • R10/2020-12-23T20:00:00/2020-12-23T21:00:00
(2020年12月23日20時0分0秒から2020年12月23日21時0分0秒までの時間間隔を10回) • 反復回数+始点と経過時間 • 反復回数+経過時間と終点 10
11 ソフトウェア設計への活用
1. よくみるオレオレ連携仕様の改善 12 { "id": "00000042", "createdAt": "2020/12/23 20:00:00" }
{ "id": "00000042", "createdAt": "2020-12-23T11:00:00Z" }
1. よくみるオレオレ連携仕様の改善 • 情報交換においては,人への表現形式よりも 効率性の高さや曖昧さの少なさが重要 • メジャーなAPIにおける日時表現はISO 8601(GitHub REST APIとか)
• 多くの言語は日時のISO 8601形式の変換をサポートしている • Java: java.time.OffsetDateTime • .Net: ラウンドトリップ ("O", "o") 書式指定子 • JavaScript: Date.toISOString() • Swift: ISO8601DateFormatter • Python: datetime.isoformat() 13
2. 曜日の数値表現 14 ݄ Ր ਫ ۚ
0 1 2 3 4 5 6 1 2 3 4 5 6 7 2 3 4 5 6 7 1
2. 曜日の数値表現 15 ং ໊༵ 01 ݄༵ 02 Ր༵ 03
ਫ༵ 04 ༵ 05 ༵ۚ 06 ༵ 07 ༵ cf) JIS X 0301:2002 4.3.2.2 ྺि
注意事項 • 標準規格が絶対ではない • 形式や表記の種類が多いので,全部対応は現実的ではない • 標準規格を参考にしつつも,情報交換当事者間で調整し合意することが必要 • 基本形式,拡張形式,完全形,省略表記 •
小数精度 • エンコード • ISO 8601が定義するのは文字列の表現のみで, エンコードは別途取り決めが必要 • etc 16
まとめ • 情報交換における時間の文字列表現は,ISO8601を 参考に設計しよう • 日付 • 日時 • 時間間隔
• 反復時間間隔 17
おまけ 18 ぼくの冬休み 2020-12-25T18:00:00+09:00/2021-01-05T09:30:00+09:00
19 Appendix
補足 • 拡大表記 • example: 4桁の西暦では足りないとき • +10001-12-23 (10001年12月23日) •
時刻 • 指示記号 T をつけてもよい: T20:00:00 • 00:00:00 と 24:00:00 はどちらも夜の12時 • 日付や期間でない場合は同義 • 24:00:00 は時間間隔の終了点にだけ使うのが望ましい • うるう秒は考慮されている(秒は0-60が定義されている) 20
日本向けの拡張(JIS X 0301) • 元号表記: R02.12.23 • あんまり使わないほうがよいと思う・・・(私見) • R(令和)が出たことで反復時間間隔の指示記号と混同する
• 基本形式が YY.MM.DD なので,異なる元号の年が 同じ表現になる(たぶん) • 人向けの表現にはよいけど,データ交換用には不適当かも 21
年月日のセパレータの違い • "/" は一般的によく使われているが, ロケールにより年月日の順番が違うので混乱を招く恐れがある • ISO8601では "-" が基本 •
"/" は時間間隔と反復時間間隔の要素セパレータ 22
規格書の参照 • ISOは有料 • JISは無料ユーザ登録で閲覧のみ可能(DLや印刷は不可) • 今回はJIS X 0301にISO 8601の翻訳が含まれていたので,
JISを参照した • JIS X 0301 「情報交換のためのデータ要素及び交換形式ー 日付及び時刻の表記」 23
refs • ISO 8601 - Wikipedia • https://ja.wikipedia.org/wiki/ ISO_8601#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8 %80%E8%AA%9E%E3%81%A7%E3%81%AE%E5%AE%9F%E8%A3%85
• Date format by country - Wikipedia • https://en.wikipedia.org/wiki/Date_format_by_country 24