ちょっと古いのですが、面白い記事を読みました。
VBAの開発者が初めてビル・ゲイツにレビューをしたときの話なのですが、私が興味を持ったのは日付の計算に関するExcelの「バグ」です。
My First BillG Review – Joel on Software
Excelは日付を「1日」を「1.0」という数として管理しています。そして「1900年1月1日」を「1」とし、翌日を「2」としています。これを「シリアル値」と呼んでいます。
Excelの日付とシリアル値の関係は次の通りです。
Excelの表示 | シリアル値 |
---|---|
1900/1/1 | 1 |
1900/1/2 | 2 |
1900/1/3 | 3 |
略 | 略 |
1900/2/27 | 58 |
1900/2/28 | 59 |
1900/2/29 | 60 |
1900/3/1 | 61 |
1900/3/2 | 62 |
1900/3/3 | 63 |
年が4の倍数のとき、閏年で2月29日までありますが、年が100の倍数のときは例外として閏年になりません。
したがって1900年は閏年でないので2月29日はないはずです。
しかしExcelには「1900年2月29日」が存在します。
本文でも触れられていますが、これはExcelのバグではなく、当時、先行していたLotus123の仕様に意図的に合わせたもので、実はLotus123のバグだそうです。
余談ですがJavaScriptでは1900年は閏年ではありません。
次に示すのは1900年2月26日から1日ずつ足して表示したものですが2月29日はありません。
Mon Feb 26 00:00:00 UTC+0900 1900
Tue Feb 27 00:00:00 UTC+0900 1900
Wed Feb 28 00:00:00 UTC+0900 1900
Thu Mar 1 00:00:00 UTC+0900 1900
Fri Mar 2 00:00:00 UTC+0900 1900
Sat Mar 3 00:00:00 UTC+0900 1900
コメント