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
170
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
160
入門 FormObject / An Introduction to FormObject #kaigionrails
expajp
2
7k
あなたの「仮説検証」、ゆがんでいませんか? / Isn't Your "Hypothesis Verification" Distorted? #emoasis
expajp
2
570
Rubyはなぜ「たのしい」のか? / Why is Ruby a programmers' best friend? #tqrk15
expajp
5
2.1k
エンジニアリングマネージャーはどう学んでいくのか #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
630
わたしのメタ学習 / My Own Meta Learning #shinjukurb
expajp
0
530
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
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.2k
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
130
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
1.2k
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
630
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
150
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
1.2k
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
6
2.4k
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
240
フィジカル版Github Onshapeの紹介
shiba_8ro
0
270
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
200
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
150
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Building AI with AI
inesmontani
PRO
1
1.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
240
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
The untapped power of vector embeddings
frankvandijk
2
1.8k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
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には、 暦という最悪のシステムの闇、 もとい⼈類の叡智が漏れ出ている ⽇付だけでこれです これに時刻を加えるともっと複雑なことに……