OLE Automation date format

OLE Automation date format

[21] 初日 (値 1) とする整数時刻系1900 date system などと呼ばれます。


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

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

[22] 便宜上Lotus 1-2-3暦などと呼ばれます。

[23] ユリウス暦置閏法なのかもしれませんが、ユリウス暦とは日付が違います。

[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

[20] Microsoft Access も内部表現で同じ形式を採用していますが、 表示は先発グレゴリオ暦を使っています。 SQLの日時形式

[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とのバグ互換のために入っていた調整に由来する。

[13] Microsoft Access で日付/時刻型の値の格納、計算、および比較を行う方法 () https://support.microsoft.com/ja-jp/help/210276/how-to-store-calculate-and-compare-date-time-data-in-microsoft-access

[14] うるう年とは何?と聞かれて困らないための雑学! | リケジョ、主婦になる, https://dorashine.com/2480.html#toc14

というのも、日本で一般的なグレゴリオ暦のうるう年の計算方法は、一番最初の「4年に一度」という部分しかプログラムに書き込まれておらず、100で割れる年・400年で割れる年の例外が省かれて処理されている場合があります。

この最たる例がExcelです。

と言っても、私が使っているExcelちょっと古いので(2010)、現在は修正されている可能性もありますが、たった10年前までプログラムがかかれていなかったというのは逆に驚きかなぁと思います。

Excelですらコレなので、安い卓上カレンダーなんかは推して知るべしかなぁと思います。

しかし100と400の法則を追加するとプログラムがややこしいことになるし、実際に次の例外2100年までその卓上デジタルカレンダー使えるだろうか?って言うと微妙なので・・・別に気にしなくてもいいかなぁという気はいたします。

[15] 実際に Excel で1900年を試してみた画像あり。2100年も試してみたら別の結論を導けただろうに、惜しい!

[16] PDB (Palm OS) - Wikipedia (, ) https://en.wikipedia.org/wiki/PDB_(Palm_OS)#PDB_Datetimes

Some sources even suggest some very old files may use times counting from 1900 (which would be consistent with the Excel epoch).

[19] コロナの陽性判明日が“明治33年”になってて自宅療養期間が122年になってしまった人「文明開化の音がするw」「スペイン風邪より前」 - Togetter, https://togetter.com/li/1871385

[24] 西暦1900年1月1日ないし0日を元期とする日時系は他にもいろいろあります。 元期

[26] Excel specifications and limits - Microsoft Support, https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3

Earliest date allowed for calculationJanuary 1, 1900 (January 1, 1904, if 1904 date system is used)
Latest date allowed for calculationDecember 31, 9999
Largest amount of time that can be entered9999:59:59

[25] 1万年問題

[29] 令和6年 → 令和対応してなくて平成36年 → 元号間違えて(?)明治36年、って想像したけど全然違った

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

[31] 1900 年 3 月 1 日の前に曜日が Excel で正しくないです。 ( 版) https://support.microsoft.com/ja-jp/kb/214058

[32] 関連: 閏年バグ