Lotus 1-2-3暦

Lotus 1-2-3暦

[2] Lotus 1-2-3グレゴリオ暦を採用していますが、 1900年は閏年としていました。1900年2月29日が挿入されるため、 取り扱い可能な最初の日である1900年1月1日から1900年2月28日までが、 グレゴリオ暦とは1日ずれています。

[3] 誤方互換性のため、 Microsoft Excel がこれを踏襲しています >>1

[4] Excel の 1900 年を基準とした日付方式と 1904 年を基準とした日付方式の違いについて () <https://support.microsoft.com/ja-jp/kb/214330>

[5] Days of the week before March 1, 1900 are incorrect in Excel () <https://support.microsoft.com/en-us/kb/214058>

[6] Excelだけに存在する日付 | ユニリタブログ () <http://www.unirita.co.jp/blog/data-utilization/data-linkage/20141202.html>

この記載によると、Office Open XML形式ファイルの仕様上は、(マイナス数値を使って)0001/01/01から扱うことができ、「1900/02/29」は存在しないことになっています(なので、1900/02/28より前の日付において、仕様とExcelの実装には差異があります)。過去の「ECMA-376」では、「1900/02/29」は「古い表計算ソフトとの互換のため」として定義があったと記憶しているので、版が進んだことでその仕様は無くなったようです。

[7] Excelだけに存在する日付 | ユニリタブログ () <http://www.unirita.co.jp/blog/data-utilization/data-linkage/20141202.html>

「1900年から計算する」設定で数値「0」を日付に変換すると…

1900/1/0

 

これまた困った日付に…

[8] Standard ECMA-376 () <http://www.ecma-international.org/publications/standards/Ecma-376.htm> ECMA-376 1st edition Part 4 1919ページ

date1904 (Date 1904)

Specifies a boolean value that indicates whether the date systems used in the workbook starts in 1904.

A value of on, 1, or true indicates the date system starts in 1904.

A value of off, 0, or false indicates the workbook uses the 1900 date system, where 1/1/1900 is the first day in the system.

The default value for this attribute is false.

The possible values for this attribute are defined by the XML Schema boolean datatype.

[9] DateTime.ToOADate Method (System) () <https://msdn.microsoft.com/en-us/library/system.datetime.tooadate(v=vs.110).aspx>

An OLE Automation date is implemented as a floating-point number whose integral component is the number of days before or after midnight, 30 December 1899, and whose fractional component represents the time on that day divided by 24. For example, midnight, 31 December 1899 is represented by 1.0; 6 A.M., 1 January 1900 is represented by 2.25; midnight, 29 December 1899 is represented by -1.0; and 6 A.M., 29 December 1899 is represented by -1.25.

The base OLE Automation Date is midnight, 30 December 1899. The minimum OLE Automation date is midnight, 1 January 0100. The maximum OLE Automation Date is the same as DateTime.MaxValue, the last moment of 31 December 9999.

[10] How to recognize different types of timestamps from quite a long way away – The Old New Thing () <https://blogs.msdn.microsoft.com/oldnewthing/20030905-02/?p=42653/>

The OLE automation date format is a floating point value, counting days since midnight 30 December 1899. Hours and minutes are represented as fractional days.

[11] グレゴリオ暦?ユリウス暦? データベースによって異なる、日付時刻型が扱える範囲 | ユニリタブログ () <http://www.unirita.co.jp/blog/data-utilization/data-linkage/20141216.html>

Accessの場合、内部数値の「0」は「1899/12/30」を表します。Accessの日付/時刻型に時刻だけ入れたときに、「1899/12/30」が表示されたことのあるかたもいらっしゃると思います。

Excelと1日分ずれている理由は、

1900/03/01から9999/12/31までの日付は、ExcelもAccessも同じ内部数値

1900/02/29はAccessに存在しないので、1900/02/28以前は内部数値が1ずれる

そのため、1900/01/01は、Excelは「1」で、Accessは「2」

そこから2日さかのぼると、「1899/12/30」

 

です。

それ以前の日にちは、マイナスの内部数値で持っています。

(内部数値的には扱えるのに、)西暦100年以降しか扱えないのは、西暦2桁入力のためだと思います<例>99/12/30→1999/12/30と認識

(確証はありませんが、Lotusの日付の扱いもそうであったので、おそらく)。

Microsoft Accessでは、全期間にわたってグレゴリオ暦として扱われます。

[12] 1月0日 - Wikipedia () <https://ja.wikipedia.org/wiki/1%E6%9C%880%E6%97%A5>

マイクロソフト・エクセルによる1900年日付様式によれば、1900年1月0日はJanuary 0, 1900と表示された[3](これはもともと、Lotus 1-2-3とのバグ互換のために入っていた調整に由来する。