› ツール一覧 › 意地悪な日付ジェネレーター
TOOL

意地悪な日付

うるう年、月末、年度またぎ、改元日、2038年。
今日の日付では絶対に出ないバグを、狙って踏みにいく。

日付を出す 実装差分が出る計算 なぜ日付で事故るのか よくある質問

日付のバグは、開発中には絶対に顔を出しません。作っている最中に使うのはいつも「今日」で、今日はたいてい月の途中だからです。事故が起きるのは決まって2月29日・月末・年度末・改元日。このツールは基準日を1つ決めるだけで、その周辺の意地悪な日付をまとめて並べます。クリックでコピーして、そのまま入力欄に流し込んでください。すべてブラウザ内で計算しています。

日付を出す

基準日を決めると、周辺の境界日が並びます
—

実装差分が出る計算

同じ式でも、環境によって答えが違う

「月末に1ヶ月足す」は、正解が1つに決まりません。仕様で決めていない場合、どちらの答えが返っても文句が言えない状態になります。基準日を変えると、以下の計算結果も追従します。

なぜ日付で事故るのか

日付は「連続した数字」に見えて、実際にはそうではありません。月の長さは28〜31日でばらつき、4年に1度は2月が伸び、100年に1度はその例外が起き、400年に1度は例外の例外が起きます。年度は年と一致せず、元号は予告なく変わり、同じ瞬間でもタイムゾーンをまたげば日付が変わります。

それでも開発中は何も起きません。今日の日付は、そのどれにも当たらない安全な日だからです。バグは本番稼働から数ヶ月後、たまたま月末に処理を回した日にはじめて姿を現します。

だから日付は「意地悪な値を狙って入れる」以外に見つけようがありません。境界値分析の考え方そのままで、月末・年度末・うるう日という切り替わりの直前と直後を並べて試すのが確実です。技法としての整理は テスト技法カタログ に、入力欄そのものを壊しにいく値は 意地悪テストデータ生成器 にまとめています。

よくある質問

なぜ日付のバグはこんなに多いのですか?+
月の長さが揃っていない、うるう年がある、年度と年が一致しない、元号が変わる、タイムゾーンで日付がずれる——このどれもが「ふつうの日付」では表に出ないためです。開発中に使うのはたいてい今日の日付で、そこは何の問題も起きません。事故は決まって月末・年度末・2月29日に起きます。
1月31日の1ヶ月後は何日ですか?+
仕様によります。多くの日付ライブラリは月末に丸めて2月28日(うるう年なら29日)を返しますが、JavaScriptの Date で setMonth を使うと「2月31日」がそのまま繰り上がって3月3日になります。どちらが正しいかは仕様次第なので、まず「決めてあるか」を確認してください。このツールでは両方の答えを並べて表示します。
2038年問題とは何ですか?+
時刻を1970年1月1日からの経過秒数で32ビット整数に入れている環境で、2038年1月19日3時14分7秒(UTC)を超えると数値があふれてしまう問題です。有効期限や長期の契約期間を扱う画面では、この日をまたぐ日付を入れて確認しておくと安全です。
1900年2月29日という日付は実在しないのでは?+
実在しません。1900年は400年ルールでうるう年から外れるためです。それでも表に載せているのは、Excelが互換性のためにこの日を実在するものとして扱っているからです。Excelから取り込んだ日付をそのまま計算に使うと、1日ずれることがあります。
入力した基準日はサーバーに送られますか?+
送られません。日付の計算はすべてブラウザ内(あなたの端末上)で処理していて、サーバーには一切送信していません。

入力欄そのものを壊しにいく値は 意地悪テストデータ生成器、境界値分析の考え方は テスト技法カタログ、日付の入力チェックに使う正規表現は 正規表現テスター をどうぞ。