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
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
240
AIのReact習熟度を測る
uhyo
2
620
失敗を資産に変えるClaude Code
shinyasaita
0
690
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
【2026年版】 ベクトル検索䛸 Embedding最前線
mocobeta
6
2.3k
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
150
気づかぬうちにセキュリティ負債を生むAPIキー運用
sgwrmctk
0
170
SONiCの統計情報を取得したい
sonic
0
190
手塩にかけりゃいいってもんじゃない
ming_ayami
0
600
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
630
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
380
人材育成分科会.pdf
_awache
4
280
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
11
38k
Being A Developer After 40
akosma
91
590k
RailsConf 2023
tenderlove
30
1.5k
Thoughts on Productivity
jonyablonski
76
5.2k
Color Theory Basics | Prateek | Gurzu
gurzu
0
360
The SEO Collaboration Effect
kristinabergwall1
1
490
Tell your own story through comics
letsgokoyo
1
950
Discover your Explorer Soul
emna__ayadi
2
1.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
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には、 暦という最悪のシステムの闇、 もとい⼈類の叡智が漏れ出ている ⽇付だけでこれです これに時刻を加えるともっと複雑なことに……