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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
sg4k0
November 17, 2025
Programming
0
450
「文字列→日付」の落とし穴 〜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エージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
6
680
Raku Raku Notion 20260128
hareyakayuruyaka
0
370
Data-Centric Kaggle
isax1015
2
780
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
230
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
800
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
1
130
CSC307 Lecture 09
javiergs
PRO
1
840
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
390
並行開発のためのコードレビュー
miyukiw
0
1.3k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
240
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Practical Orchestrator
shlominoach
191
11k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
110
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
590
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
53
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
57
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
150
Visualization
eitanlees
150
17k
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