メニュー

生年月日バリデーションの境界ケース: うるう年と年齢

生年月日を扱うときに必ず引っかかる境界を整理します。うるう年と2月29日、誕生日当日の満年齢、時計のずれ、暦が異なる国の書き方、仮の生年月日をそのまま使う危険を扱います。

公開日

  • テストデータ
  • 境界値

生年月日のバリデーションとは、入力された日付が現実に存在する日かどうか、そして年齢の条件を満たしているかを確かめる処理のことです。日付は一見単純な項目ですが、境界を丁寧に決めないと、正しい入力が弾かれたり、誤った入力が通ったりします。この記事では、実際に問題が起きやすい箇所を順に確認します。

存在しない日付はどこまで弾くのか?

日付の妥当性は、月ごとの日数と、うるう年の規則で決まります。公暦のうるう年は、四で割り切れる年ですが、百で割り切れる年はうるう年ではなく、四百で割り切れる年は再びうるう年になります。この規則のため、十九世紀の終わりと二十世紀の終わりはうるう年ではありませんが、二十一世紀の終わりはうるう年になります。

年 2月29日の有無 理由
四の倍数の年 ある 基本の規則に当てはまる
百の倍数の年 ない 例外の規則に当てはまる
四百の倍数の年 ある 例外の例外に当てはまる

この規則を自前で書かず、日付を扱う標準の仕組みに任せるのが安全です。自前の計算は、例外の例外を落としがちです。

2月29日生まれの人はどう扱うのか?

法律や運用の扱いは国や制度によって分かれます。大きくは次の三つです。

  • 2月28日を誕生日とみなす。
  • 3月1日を誕生日とみなす。
  • 前後の期間で区切って扱う。

どれを採るかは、対象の制度の定めによります。テストでは、この三つのうち自分の仕組みが採っているものだけを確かめれば足ります。ただし、採用していない扱いを前提にしたデータを混ぜると、結果の解釈がぶれます。

誕生日当日は満年齢に含まれるのか?

多くの制度では、誕生日を迎えた時点で一つ上の年齢になります。つまり、当日はすでに新しい年齢です。「あと一日で条件を満たす」という状態と「今日満たした」という状態は別の日になるため、境界の確認ではこの二日を必ず両方試します。

年齢の条件を判定するときは、年齢を数値として保存せず、生年月日と判定日から毎回計算します。保存した年齢は、時間が経つと正しくなくなります。年齢の計算を使う場面は年齢確認テストの設計で扱っています。

「今日」はどの時点の今日なのか

年齢の判定には、いつの時点の日付を使うかという前提が付きます。利用者の端末の時刻と、サーバーの時刻と、記録に残る時刻は、同じ瞬間でも日付が違うことがあります。時差の大きい地域をまたぐと、一方では誕生日が過ぎているのに、もう一方ではまだ前日、という状態が起こります。

このため、判定に使う日付をどこで決めるかを先に決めておく必要があります。端末の日付を使うのか、受け取った時点のサーバーの日付を使うのかで、境界日の結果が変わります。どちらかに統一し、その前提を記録に残しておくと、後から結果を説明できます。

暦が異なる国ではどう書くのか

世界には公暦以外の暦を使って生活している地域があります。同じ日でも、暦が違えば年と月日の書き方が変わります。公暦で書かれた日付をそのまま受け取る前提で作ると、利用者が自分の暦で入力したときに、まったく別の日付として扱われます。

国際的なサービスでは、入力の書式をはっきり示すのが現実的です。年月日の順序も、国によって月が先に来る場合と日が先に来る場合があります。順序を固定せずに受け取ると、月初の十二日までの日付が入れ替わって解釈されます。これは見つけにくい不具合の代表例です。

仮の生年月日をそのまま使うと何が起こるのか?

テスト用に適当な日付を入れておき、そのまま初期値として残してしまうと、後から実データと混ざります。極端に古い年や未来の年が混ざると、年齢の集計や並び替えの結果が崩れます。

当サイトの身元生成ツールでは、現実的な範囲の生年月日を含む身元情報を生成できます。初期値の確認や境界の確認に使う値として、その場で用意できます。生成される身元情報はテスト専用の合成データであり、実在の人物になりすます目的には使えません。

開発者向け: 日付をどう保存し、どう比べるか

生年月日は日付として保存し、時刻と時差は持ちません。時刻を持たせると、保存した環境と読む環境の違いで前日にずれることがあります。表示のときに書式を整え、比較するときは日付のまま扱うのが基本です。

年齢は、生年月日と判定日から計算します。月の差と日の差を順に見て、誕生日を迎えていなければ一つ引く、という手順です。日数の割り算で年を出す方法は、うるう年の分だけずれます。

境界の確認に用意したい値は、次の四つです。今日が誕生日の人、明日が誕生日の人、昨日が誕生日だった人、そして2月29日生まれの人。この四つを通せば、規則の取りこぼしの多くが見つかります。固定の装置として保存しておけば、毎回同じ結果を確認できます。日付をまたぐデータの作り方はテスト固定装置の身元データでも扱っています。

次のステップ

まず、自分の入力欄が年月日の並び順を明示しているかを確認してください。次に、年齢の判定に保存済みの数値を混ぜていないかを見直します。どちらも小さな修正で済みますが、放置すると後から原因を追いにくい種類の不具合になります。身元生成ツールで生年月日の項目を確認しながら、手元の境界の値をそろえておくと確認が早くなります。

続けて読む

オンライン身元・テストデータ生成ツールの関連記事