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
190
入門 FormObject / An Introduction to FormObject #kaigionrails
expajp
2
7.4k
あなたの「仮説検証」、ゆがんでいませんか? / 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
650
わたしのメタ学習 / 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
タクシーアプリ『GO』の実践的データ活用〜位置情報データの収集とStreamlitでの可視化〜
mot_techtalk
2
180
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
410
AIが自社のTableauを操作する世界へ:Tableau MCP超入門
tbtykk
0
100
SnowflakeCoCoでデータエンジニアリング!
foursue
0
130
脱Jenkins、インターン生が挑んだCIツールGitHubActions移行
mixi_engineers
PRO
1
310
データ組織の転換期 一足飛びしない段階的戦略
leveragestech
PRO
0
140
第3回しろおびセキュリティスポンサーセッション
log0417
0
110
LangfuseによるLLMOps基盤の構築と活用事例
zozotech
PRO
1
250
BigQuery を検索ソースとした AI Agent の作り方って 〇〇 通りあんねん
satohjohn
0
150
PLaMo 3.0 Primeの構造化出力サポート
pfn
PRO
0
170
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
8
7.1k
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
110
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Being A Developer After 40
akosma
91
590k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
The Limits of Empathy - UXLibs8
cassininazir
1
570
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
200
WENDY [Excerpt]
tessaabrams
11
39k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
A better future with KSS
kneath
240
18k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
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には、 暦という最悪のシステムの闇、 もとい⼈類の叡智が漏れ出ている ⽇付だけでこれです これに時刻を加えるともっと複雑なことに……