うるう年、うるう日のチェック処理Tips

オリンピック(夏季)の年はうるう年と認識して(東京オリンピックは1年延びたので異なりますが)対応していれば大体は大丈夫ですが、コンピュータの世界では、過去や未来の日付を扱う事が有るので、2024年に向けて、うるう年、うるう日の処理を確認するTipsをメモします。

<そもそもの基礎知識>

うるう年は、西暦の年を4で割れればうるう年です。ただし、以下の例外が有ります。

 a)年が100で割り切れるが400で割り切れない年はうるう年で無い。

これは、2000年はうるう年ですが、2100年とか2200年はうるう年で無い事を示しています。知識として覚えておく必要が有ります。(常識と思っていると、意外に知らない人がいます)

<日付項目の対象を抽出する場合>

日付を扱っている(うるう年のチェック確認を実施する)対象を洗い出す上での留意点です。一つの手段で無く、複数で実施して漏れなく洗い出す事が肝要。

 a)ドキュメント(機能仕様書、I/F仕様書等)から洗い出す。<-完全で無い事が多いのでこれのみに頼ってはいけない。

 b)ソースコード、定義ファイル(画面や帳票、iniファイル等)等から、日付項目(と思われる)箇所を、機械的に洗い出す(検索等)。それらしい名称等で!。

 c)固定値をセットしているとか、うるう年をハードコーディングしているとかを洗い出す。

 d)うるう年の判断に使用しているライブラリや共通関数等を洗い出す。バージョンも含め。

<有りがちなトラブル>

有りがちな事例を何パターンか!。

 a)年を4桁で持っていれば良いが、1桁とかでしか持っていない場合に、2010を足して判断。->2022年を”2”で保持。2010を足して2012年として計算した為、うるう年と判断した。<-同じロジックが2010年代は問題無く動いていて見過ごした。

 b)ライブラリの仕様変更で判断が変わる。->例えば、VisualC++は、2005を境に仕様が変わった。

 c)1年前の日付を求めるのに、単純に年から-1を行う。うるう日を基準とすると、実在しない日になる。

<日付計算等での確認事項>

 a)うるう日(2/29)をまたぐ日数計算が正しく行われる事。->2020/2/28~2020/3/2 4日間。2021/2/28~2021/3/2 3日間等。

 b)うるう年の2月の末日は29日で有る事。

 c)うるう年の日数は366日として処理される事。<-1年間の日数が固定で無い事。同様に、うるう年の2月は29日として処理される事も要注意。

 d)うるう年の2/29の前後判断が正しい事。<-2/28 は前日(or過去日)、3/1 は翌日(or未来日)等。

 e)うるう年の365日目、366日目、及び367日目がそれぞれ、12/30、12/31、翌年1/1 として処理される事。

 f)うるう年の2/29、3/1 の曜日がそれぞれ正しい事。<-和暦変換を実施している場合は、和暦が正しい事も!

<入出力の処理等>

 a)システムの立ち上げが、2/29を指定して可能な事。<-実在日をチェックしている場合は、2021/2/29 等(うるう年以外(実在しない日))を指定して立ち上げが出来ない事も。

 b)日付入力で、うるう年の2/29 が入力可能で、うるう年以外の2/29 が入力不可な事。

 c)帳票や画面等にうるう年の2/29 が正しく印刷(表示)される事。

 d)Logやジャーナルに、2/29 が正しく出力され、順番も正しい事。

 e)外部I/F(データのやりとり等)で、うるう年の2/29 が受取り/送信 可能で正しく処理される事。

<運用その他>

 a)末日締めがうるう年の2/29 で実施可能な事。

 b)バックアップ等がうるう年の2/29 に取得可能で、且つ、回復可能な事。

 c)うるう年の2/29 を含んで日跨がりの処理が正しく実施出来る事。

<その他のメモ>

 a)汎用品のDBとかを使用する限り、うるう年の2/29 が格納出来ないとかは発生しない。但し、明確なソート順を指定していない場合、並び順が変わる事が有る物が有る。

 b)実機テストを行う場合、業務日付(起動時に指定とか)のみで無く、システム日付(マシンのシステム日付とか、BIOSの日付とか、NTPサーバが返して来る日付とか)類も変更して確認をする事。<-ジャーナル付きファイルシステムの場合、安易に日付を戻すとファイルの不整合が発生する場合が有るので、使用環境を良く理解してテストを行う事。

コメント

PAGE TOP