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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
sg4k0
November 17, 2025
Programming
0
480
「文字列→日付」の落とし穴 〜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時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
660
Event Storming
hschwentner
3
1.3k
AIプロダクト時代のQAエンジニアに求められること
imtnd
2
740
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
210
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
610
TROCCOで実現するkintone+BigQueryによるオペレーション改善
ssxota
0
140
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
590
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
10
2.5k
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
170
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.7k
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
210
Geminiの機能を調べ尽くしてみた
naruyoshimi
0
200
Featured
See All Featured
Technical Leadership for Architectural Decision Making
baasie
3
270
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
GitHub's CSS Performance
jonrohan
1032
470k
SEO for Brand Visibility & Recognition
aleyda
0
4.3k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
470
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
51k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
What does AI have to do with Human Rights?
axbom
PRO
1
2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
190
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