FormIO シリアル値

 エクセル5では、1900-01-01 00:00:00 を1として、以降1日を1とした数値で日付時刻を表しています。時刻は小数部として表され、たとえば1900-01-02 12:00:00 は 2.5 となるわけです。
 この値をシリアル値といいます。エクセル5のシリアル値は整数部が符号なしの16ビット整数の範囲内なので、1900〜2078年までしかサポートされません。
 エクセル5のような表計算ソフトでは、これで十分かもしれませんが、FormIOは用途を表計算に限定したものではありませんから、これでは範囲不足となることが十分に考えられます。明治32年以前が表せないため、特に日本では不都合が生じる可能性が高いでしょう。
 そこで、シリアル値も通常の数値と同様に、日付時刻合わせて80ビットの拡張倍精度浮動小数点数で表し、上記範囲までサポート範囲を拡大しました。もっと拡大することもできたのですが、出力書式の「年」が最大4桁であるため、これ以上拡大しても意味をもたないため、この範囲で留めました。
 余談ですが、エクセル5でシリアル値0を日付として表示させると 1900-01-00となります。

★★★ 重要な注意事項 ★★★

 上記の通り、本来ならばエクセル5のシリアル値は 1900-01-01 を1とするはずで、実際マニュアルにもオンラインヘルプにも、そのように記述されていますが、エクセル5自体のバグのため、1900-03-01以降の値が不正になっています(したがって正確なのは最初のわずか2ヶ月ということになります)。
 エクセル5のバグは、本来閏年ではない西暦1900年を閏年としてしまったために、この年の2月29日をカウントしてしまい、以降のシリアル値がすべて1ずつ大きくなってしまうというものです。
 閏年は通常4の倍数の年とされていますが、実はその中でも400の倍数ではなく、100の倍数である年は閏年ではなくなるように定められています。ところが、おそらくエクセルの当初の開発者が単純に4の倍数年すべてを閏年としていまい、それが延々現在までそのままになってしまったということだと思われます。
 そこで、FormIOでは1900-01-01 〜 1900-02-28が百年近く昔の、僅か2ヶ月であることから、この間のシリアル値がずれることには目をつぶり、初期値を2とすることにしました。これはFormIO以前に出された各社有力ソフトの、このバグへの対処と同様の対応です。
 ちなみに、西暦2000年は、100の倍数年であると同時に、400の倍数年でもあるため閏年となり、この年は閏年として扱うことが正当であり、幸いにもエクセル5のシリアル値は2078年までですから、このようなバグは1900年のみで済みました。
 またMacintosh版エクセルは 1904-01-02 を1としているため、このようなバグは「偶然にも」発現することはありません。
 余談ですが、開始年を何年とするかは別として、その1月1日はやはりMacintosh版のように0とすべきで、Windows版のように1とすべきではないでしょう。