Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
あなたの知らないDateのひみつ / The Secret of "Date" You Hav...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Shu OGAWARA
November 29, 2025
Technology
190
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
210
入門 FormObject / An Introduction to FormObject #kaigionrails
expajp
2
7.9k
あなたの「仮説検証」、ゆがんでいませんか? / Isn't Your "Hypothesis Verification" Distorted? #emoasis
expajp
2
600
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
6k
RubyKaigi参加歴をふりかえる / Looking Back on My RubyKaigi Participation History #kaigieffectLT
expajp
3
660
わたしのメタ学習 / My Own Meta Learning #shinjukurb
expajp
0
560
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
Omarchy Quattro の日本語設定周り
simosako
2
140
あるけみー式LTスライド作成術
alchemy1115
1
160
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
340
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.5k
V8コントリビュート超入門
riyaamemiya
0
160
enechainの内製セルフサービスプラットフォーム
hiyosi
0
150
Oracle Cloud Infrastructure IaaS 新機能アップデート 2026/6 - 2026/8
oracle4engineer
PRO
0
140
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
150
GoにおけるFFIのこれまでとこれから
goccy
5
2.1k
module Synths; end
asonas
1
130
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
1
280
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Building an army of robots
kneath
306
46k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
480
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
320
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
690
The World Runs on Bad Software
bkeepers
PRO
72
12k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
880
Claude Code のすすめ
schroneko
67
230k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
350
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には、 暦という最悪のシステムの闇、 もとい⼈類の叡智が漏れ出ている ⽇付だけでこれです これに時刻を加えるともっと複雑なことに……