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
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
Search
sg4k0
November 17, 2025
Programming
620
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
YAPC::Fukuoka 2025の2025/11/14に開催されたU29セッションの登壇資料です。
sg4k0
November 17, 2025
Other Decks in Programming
See All in Programming
信頼性の目標を誰も求めてない
shubox
0
480
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
130
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
140
typoなんかねぇよ
raspython3
0
650
AIエージェント時代のコードレビューを設計する
nogu66
5
2.3k
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
130
Cloudflare is Agents
chimame
0
190
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
260
My Marp Sample
sinoue0108
0
140
AIの中の人になってみる
htkym
0
150
XHTMLが残したもの
yosuke_furukawa
PRO
1
370
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
3
490
Designing for Timeless Needs
cassininazir
1
470
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
640
Paper Plane
katiecoart
PRO
2
53k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Between Models and Reality
mayunak
4
440
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
How to Ace a Technical Interview
jacobian
281
24k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Navigating Weather and Climate Data
rabernat
0
510
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
230
Transcript
© SmartHR, Inc. 「⽂字列→⽇付」の落とし⽳ 〜Ruby Date.parseの意外な挙動〜 YAPC::Fukuoka 2025 U29セッションスポンサーLT ⽥中
優輝 SmartHR プロダクトエンジニア 2025/11/14
⾃⼰紹介 • tanayu(⽥中優輝) • 株式会社SmartHR(2023/04〜) ◦ 労務の基本機能を開発 ◦ プロダクトエンジニアで主にバックエンドを担当 •
福岡在住 • YAPC初参加!
None
4
5
技術スタック • Ruby on RailsやReactなど ◦ Rubyの業務経験なしで⼊社されている⽅も2〜3割います • Claude CodeなどAI開発⽀援ツールも利⽤可
• 詳細はSmartHR エンジニア採⽤をご覧ください ◦ https://hello-world.smarthr.co.jp 6
働き⽅ • フルフレックス(コアタイムなし) • エンジニアはフルリモートワーク可 ◦ 出社⽇数の指定なし • ワーケーションも可 •
⼊社⽇に15⽇の有給付与 • 勉強会やカンファレンス参加⽀援 7
積極採⽤中!! • エンジニアはもちろん、QAやPM、その他業種も 積極採⽤中です! • 新卒採⽤もやっており、積極採⽤中です! • 少しでも興味を持たれたら、カジュアル⾯談も やっているのでお気軽にどうぞ! •
愛する福岡から離れられないという⽅もぜひ! 8
SmartHRの増えてくアクキー • このパーカーを着ている⼈が配っていますの で、ぜひ声をかけていただき、交流してくださ い! 9 メンバーが着ているパーカー 配っているアクキー
None
突然ですが皆さんは ⽂字列を⽇付として扱いたいとき ありませんか!?
⼤体こんなときに使いたい • ユーザーが⼊⼒した内容をDBの⽇付型カラ ムに保存したい • 1週間後の⽇付を取得したい • 特定の⽇から何⽇経過しているのか算出し たい 12
Rubyだとメソッドが⽤意されている 13 出典:Date.parse (Ruby 3.4 リファレンスマニュアル ) Date.parse('2025-11-14') => #<Date:
2025-11-14 ((2460994j,0s,0n),+0s,2299161j)>
parseは元号にも対応している • 元号付きの⽇付を⼊⼒してもOK • RubyのDate.parseはC⾔語で書かれている ◦ RubyにはC ⾔語で書かれたネイティブコードを呼 び出す仕組みがある 14
Date.parse('R7.11.14') => #<Date: 2025-11-14 ((2460994j,0s,0n),+0s,2299161j)>
とある⽇謎の挙動を観測 • 開発の検証中に「平成30年6⽉1⽇」と⼊⼒ するとParseの結果が「2025-11-30」にな る事象に遭遇した • この謎の挙動を究明すべくアマゾンの奥地 へ向かった 15
突然ですがクイズです! 正しく変換されるのはどれ!? 1. 2025年11⽉14⽇ 2. 令和7年11⽉14⽇ 16
正解は〜 全部想定外の⽇付でした! 1. 2025年11⽉14⽇ →invalid dateエラー 2. 令和7年11⽉14⽇ →2025-11-11 ⼀体何が起きている!?
17
実装を眺めてみた 18 C⾔語で書かれた処理を眺めました。内部実装⾒るの楽しい! 出典:date_parse.c
内部ではこんなことが起きていた • ハイフン区切りやスラッシュ区切りなどに該当しなかった場 合の処理が⾏われていた ◦ Date.parse(ʻ12’)などのときに動作する処理 • ⽂字列中の「2桁以上14桁以下の連続した数字」で⼀番⼤き い値を抽出 •
抽出された数字の桁数で分類 ◦ 2桁は⽇、3桁は年間通算⽇(1/1から数えて何⽇⽬)、4桁は⽉⽇など • ⾜りない桁数は現在の年⽉⽇で補われる 19
つまり先程のクイズだと… 1. 2025年11⽉14⽇ →2025が抽出され、20⽉25⽇と判断しエラー 2. 令和7年11⽉14⽇ →14が抽出され、14⽇と判断し2025-11-14 20
Date.parseはバリデータではない • Date.parseはバリデーションの役割を担っているわけではな い ◦ ドキュメントにも「This method **does not** function
as a validator.」と書かれていた ▪ https://ruby-doc.org/stdlib-3.0.0/libdoc/date/rdoc/Date.html#method-c-_par se • 検証していた実装は変換できない場合のみエラーにする実装 になっており、パースで検知する仕組みになっていた ◦ バリデーションとパースの責務は分離する 21
まとめ
• ⼊⼒された値をバリデーションもせずに変 換処理を実⾏しない • 変換処理に限らず、どんな処理でも値を渡 す際は処理側が期待している値かチェック が必要 • 標準で⽤意されているメソッドの内部を追 うのは楽しい
23
おわり
【再び】積極採⽤中!! • エンジニアはもちろん、QAやPM、その他業種も 積極採⽤中です! • 新卒採⽤もやっており、積極採⽤中です! • 少しでも興味を持たれたら、カジュアル⾯談も やっているのでお気軽にどうぞ! •
愛する福岡から離れられないという⽅もぜひ! 25