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
あなたの知らないDateのひみつ / The Secret of "Date" You Hav...
Search
Shu OGAWARA
November 29, 2025
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
あなたの知らないDateのひみつ / The Secret of "Date" You Haven't known #tqrk16
2025/11/29のTokyuRuby会議16で発表したスライドです。
https://tokyurubykaigi.github.io/tokyu16/
Shu OGAWARA
November 29, 2025
More Decks by Shu OGAWARA
See All by Shu OGAWARA
人生を変えた一冊「独学大全」のはなし / Self-study ENCYCLOPEDIA: The Book Which Change My Life #独学大全 #EM推し本
expajp
0
180
入門 FormObject / An Introduction to FormObject #kaigionrails
expajp
2
7.3k
あなたの「仮説検証」、ゆがんでいませんか? / Isn't Your "Hypothesis Verification" Distorted? #emoasis
expajp
2
580
Rubyはなぜ「たのしい」のか? / Why is Ruby a programmers' best friend? #tqrk15
expajp
5
2.2k
エンジニアリングマネージャーはどう学んでいくのか #devsumi / How Do Engineering Managers Continue to Learn and Grow?
expajp
9
5.9k
RubyKaigi参加歴をふりかえる / Looking Back on My RubyKaigi Participation History #kaigieffectLT
expajp
3
640
わたしのメタ学習 / My Own Meta Learning #shinjukurb
expajp
0
550
ActiveSupport::Concernで開くメタプログラミングの扉 #heiseirubykaigi / The door of meta-programing is opened by ActiveSupport::Concern
expajp
1
2.5k
実践Railsアプリケーション設計 #meetup_rails / Practical Rails Application Design
expajp
4
41k
Other Decks in Technology
See All in Technology
AIエージェントがあれば技術書なんてすぐ書けるでしょ→無理でした
watany
6
1k
iOS/Androidの二刀流エンジニアがFlutter & TypeScriptへ越境後の現在地 - Flutterがメインになって見えた景色と現在の醍醐味 / Dual-Platform Mobile Engineer Shifts to Flutter & TypeScript - The View and Real Thrill of Going Flutter-First
bitkey
PRO
0
110
オートマトンと字句解析でRoslynを読む
tomokusaba
0
100
データ活用研修 問いの発見と仮説構築【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
460
現場との対話から始める “作る前に問い直す”業務改善
mochico50
2
330
VPCセキュリティ対応の最新事情
nagisa53
1
340
PHPで作って学ぶリアルタイム音声対話AIとWebSocket入門 by ムナカタ
munakata
0
170
人とエージェントが高め合う協業設計
kintotechdev
0
1k
AIで楽になるはずが、なぜ疲れる?
kinopeee
0
120
WEBフロントエンド研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
490
インシデント事例と パッケージの全量解析に学ぶ ソフトウェアサプライチェーンの守り方 / supply-chain-attack-defense
flatt_security
0
1.1k
SRENEXT_2026_Chairs__Talks_in_Tamachi.sre.pdf
srenext
1
160
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
The SEO Collaboration Effect
kristinabergwall1
1
510
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How STYLIGHT went responsive
nonsquared
100
6.2k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
740
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Fireside Chat
paigeccino
42
4k
Transcript
突然ですが 2
今年は何年ですか︖ 3
そう、昭和100年ですね 4
• ⼤きなニュースになるほどのトラブルはなかった 5 昭和100年問題 コンピュータシステムの年問題の⼀つ。 過去に製作された⽇本のコンピュータシステムには年を⽇本の元号 である昭和を⽤いて管理しているものがあるが、 2025年は昭和100年であり桁数が3桁になるため、 システムが誤作動する可能性がある。 “
昭和100年問題 – Wikipedia, https://ja.wikipedia.org/wiki/%E6%98%AD%E5%92%8C100%E5%B9%B4%E5%95%8F%E9%A1%8C (2025/11/23閲覧)
実はRubyにも昭和100年で エラーが起きる箇所がある 6
Date.jisx0301('R07.11.29') # => #<Date: 2025-11-29 ((2461009j,0s,0n),+0s,2299161j)> 7 Date.jisx0301
Date.jisx0301('R07.11.29') # => #<Date: 2025-11-29 ((2461009j,0s,0n),+0s,2299161j)> Date.jisx0301('H37.11.29') # => #<Date:
2025-11-29 ((2461009j,0s,0n),+0s,2299161j)> 7 Date.jisx0301
Date.jisx0301('R07.11.29') # => #<Date: 2025-11-29 ((2461009j,0s,0n),+0s,2299161j)> Date.jisx0301('H37.11.29') # => #<Date:
2025-11-29 ((2461009j,0s,0n),+0s,2299161j)> Date.jisx0301('S100.11.29') # => (irb):4:in 'Date.jisx0301': invalid date (Date::Error) 7 Date.jisx0301 ※そもそもJIS X 0301 が3桁以上の元号を想定してないので、この挙動は仕様通りで「昭和100年問題」とは⾔えません
Dateにはこういうマニアックな メソッドがたくさんある 9 今⽇はそんなメソッドをいくつか紹介します
あなたの知らない Dateのひみつ ⼤河原 修(@expajp ) 2025/11/29 TokyuRuby会議16 10
• ⼤河原 修(@expajp ) • 「えくすぱ」と読みます • VPoE@B4A • 今⽉からお世話になってます
• 趣味 • 秘境駅めぐり🚃 • ラジオ📻 • 筋トレ💪 11 ⾃⼰紹介
①Date#mjd 12
Date#mjd を実⾏してみる Date.new(2025, 11, 29).mjd # => 61008 13
①Date#mjd 14 そもそも、なんと読むでしょう︖
15 Date#mjd Modified Julian Date (修正ユリウス⽇)
• 紀元前4713年1⽉1⽇からの経過⽇数 • 暦に関わらず⼀意に⽇を特定する概念。⽇付のID • 引数なしでDate.newするとユリウス⽇の起点になる • #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
• なんでこの⽇なのか詳しくは割愛 • いろんな周期の1年⽬がそれぞれ揃うからだそうです 16 ユリウス⽇
• 1858年11⽉17⽇からの経過⽇数 • ユリウス⽇は桁数が多く古いコンピュータでは扱えなかったため • 2132年8⽉30⽇まではユリウス⽇が240万台なので実⽤には⼗分 • いる……︖ • GitHubで⽤例をいくつか発⾒
• 定数の値を⼩さくするため使っていた 17 修正ユリウス⽇
②Date#england, #italy 18
Date#england, #italy を実⾏してみる① Date.new(2025, 11, 29).italy # => #<Date: 2025-11-29
((2461009j,0s,0n),+0s,2299161j)> Date.new(2025, 11, 29).england # => #<Date: 2025-11-29 ((2461009j,0s,0n),+0s,2361222j)> 19
Date#england, #italy を実⾏してみる② Date.new(1600, 11, 29).italy # => #<Date: 1600-11-29
((2305781j,0s,0n),+0s,2299161j)> Date.new(1600, 11, 29).england # => #<Date: 1600-11-19 ((2305781j,0s,0n),+0s,2361222j)> 20
Date#england, #italy を実⾏してみる② Date.new(1600, 11, 29).italy # => #<Date: 1600-11-29
((2305781j,0s,0n),+0s,2299161j)> Date.new(1600, 11, 29).england # => #<Date: 1600-11-19 ((2305781j,0s,0n),+0s,2361222j)> 20
Date#england, #italy を実⾏してみる② Date.new(1600, 11, 29).italy # => #<Date: 1600-11-29
((2305781j,0s,0n),+0s,2299161j)> Date.new(1600, 11, 29).england # => #<Date: 1600-11-19 ((2305781j,0s,0n),+0s,2361222j)> Date.new(1700, 11, 29).italy # => #<Date: 1700-11-29 ((2342305j,0s,0n),+0s,2299161j)> Date.new(1700, 11, 29).england # => #<Date: 1700-11-18 ((2342305j,0s,0n),+0s,2361222j)> 20
Date#england, #italy を実⾏してみる② Date.new(1600, 11, 29).italy # => #<Date: 1600-11-29
((2305781j,0s,0n),+0s,2299161j)> Date.new(1600, 11, 29).england # => #<Date: 1600-11-19 ((2305781j,0s,0n),+0s,2361222j)> Date.new(1700, 11, 29).italy # => #<Date: 1700-11-29 ((2342305j,0s,0n),+0s,2299161j)> Date.new(1700, 11, 29).england # => #<Date: 1700-11-18 ((2342305j,0s,0n),+0s,2361222j)> 20
• 🇮🇹🇬🇧での改暦⽇をもとに⽇付を表⽰するメソッド • 🇮🇹︓1582年10⽉15⽇ • 🇬🇧︓1752年9⽉14⽇ • Date#new_start • 改暦⽇を⾃由に設定できるメソッド
• 上記2つは#new_startのサブセット 21 ②Date#england, #italy 何をするメソッド︖
• カトリックの暦が16世紀に変わった • ユリウス暦からグレゴリオ暦へ • ユリウス暦 • 紀元前45年から使われ、ヨーロッパで広く使われた暦 • 4年に⼀度閏年が⼊る(=400年に100回)
• グレゴリオ暦 • 1582年からイタリア等で使われ、現在は世界中で使われる暦 • 400年に97回閏年が⼊る 22 改暦
23 なんでイギリス︖ Date::ENGLAND (Ruby 3.4 リファレンスマニュアル) https://docs.ruby-lang.org/ja/3.4/method/Date/c/ENGLAND.html (2025/11/24閲覧)
24 なんでイギリス︖ 実際にcalコマンドで1752年9⽉を⾒てみる
• Date.julian_leap? • ユリウス暦で閏年かどうかを判別する • 初期に間違えて閏年を3年に1度⼊れていたことは考慮外だが るりまでちゃんとフォローされている • Date#ajd •
その⽇AM0時の天⽂学的なユリウス⽇を返す • 細かい説明は割愛。⽤途としてはDate#jdで事⾜りるのでは︖ 27 他にもあるDateの細かすぎるメソッド
なんで細かすぎるメソッドを 定義する必要があるのか︖ 28
29 Q. なんで細かすぎるメソッドを定義する必要があるのか A. 暦はものすごく複雑だから
30 Q. 暦はなぜ複雑︖
30 Q. 暦はなぜ複雑︖ 暦は最悪のシステムだから
31 暦というシステムの最悪さ
•宇宙が仕様 31 暦というシステムの最悪さ
•宇宙が仕様 •使⽤年数が数百年 31 暦というシステムの最悪さ
•宇宙が仕様 •使⽤年数が数百年 •利⽤者は数億⼈ 31 暦というシステムの最悪さ
•宇宙が仕様 •使⽤年数が数百年 •利⽤者は数億⼈ •バグると死⼈が出る 31 暦というシステムの最悪さ
•宇宙が仕様 •使⽤年数が数百年 •利⽤者は数億⼈ •バグると死⼈が出る •システム分割不可 31 暦というシステムの最悪さ
•宇宙が仕様 •使⽤年数が数百年 •利⽤者は数億⼈ •バグると死⼈が出る •システム分割不可 31 暦というシステムの最悪さ 解決済みの時代に ⽣まれて よかったですね
暦には「天体の動きをモデル化」 してきた⼈類の叡智が詰まっている そのぶん技術的負債も溜まっている 32
33 まとめ︓Dateのひみつ Dateには、 暦という最悪のシステムの闇、 もとい⼈類の叡智が漏れ出ている ⽇付だけでこれです これに時刻を加えるともっと複雑なことに……