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
0
420
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
YAPC::Fukuoka 2025の2025/11/14に開催されたU29セッションの登壇資料です。
sg4k0
November 17, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
1
970
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
580
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
310
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
130
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
160
ゲームの物理 剛体編
fadis
0
400
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
クラウドに依存しないS3を使った開発術
simesaba80
0
220
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
7
4.3k
SQL Server 2025 LT
odashinsuke
0
120
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
0
1.6k
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
230
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
75
SEO for Brand Visibility & Recognition
aleyda
0
4.1k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
220
Music & Morning Musume
bryan
46
7k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
54
49k
How Software Deployment tools have changed in the past 20 years
geshan
0
31k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
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