web-dev-qa-db-ja.com

1900年のExcelの平日が間違っているのはなぜですか?

この質問は、 AdamV in his answer on Excelのセルに曜日名を取得するにはどうすればよいですか? の観察に基づいています。

A1の値が2009-08-01の場合、次のようになります。

  • =WEEKDAY(A1)は_7_を取得します
  • =TEXT(7, "dddd")Saturdayを取得します
  • =TEXT(7,"dddd, yyyy-mm-dd")は_Saturday, 1900-01-07_を取得します
  • =TEXT(1,"dddd, yyyy-mm-dd")は_Sunday, 1900-01-01_を取得します
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd")も_Sunday, 1900-01-01_を取得します

最後の2つは間違っています。1900年1月1日は実際には月曜日です。
さまざまな情報源が次のことを確認しているようです。

何が欠けていますか? Excelがこれを間違っているのはなぜですか?

27

Microsoftで説明されているように KB 214058

1900年3月1日より前の曜日はExcelでは正しくありません

詳しくは

Microsoft Excelの日付システムが最初に作成されたとき、他のスプレッドシートプログラムで使用されている日付システムと完全に互換性があるように設計されていました。

ただし、この日付システムでは、1900年はうるう年として誤って解釈されます。 1900年には2月29日(「うるう日」)がないため、1900年3月1日より前の日付(「うるう日」の翌日)の曜日は正しく計算されません。

「その他のスプレッドシートプログラム」は Lotus 1-2- を参照しており、当時は非常に人気があり、1900年がうるう年であると誤って想定していました。これについては、 KB 214326 :でさらに詳しく説明されています。

Excel 2000では、1900年がうるう年であると誤って想定されています

詳しくは

Lotus 1-2-3が最初にリリースされたとき、プログラムは1900年がうるう年であると想定していましたが、実際にはうるう年ではありませんでした。これにより、プログラムはうるう年を処理しやすくなり、Lotus1-2-3のほとんどすべての日付計算に害はありませんでした。

Microsoft MultiplanとMicrosoft Excelがリリースされたとき、彼らは1900年をうるう年と想定していました。この前提により、Microsoft MultiplanおよびMicrosoft Excelは、Lotus 1-2-3で使用されているのと同じシリアル日付システムを使用し、Lotus 1-2-3との互換性を高めることができました。 1900年をうるう年として扱うことで、ユーザーがワークシートをあるプログラムから別のプログラムに簡単に移動できるようになりました。

現在のバージョンのMicrosoftExcelが1900年がうるう年であると想定しないようにこの動作を修正することは技術的には可能ですが、そうすることの欠点は利点を上回ります。

この動作を修正すると、次のような多くの問題が発生します。

  • 現在のMicrosoftExcelワークシートおよびその他のドキュメントのほぼすべての日付が1日短縮されます。このシフトを修正するには、特に日付を使用する数式では、かなりの時間と労力がかかります。
  • WEEKDAY関数などの一部の関数は、異なる値を返します。これにより、ワークシートの数式が正しく機能しない場合があります。
  • この動作を修正すると、MicrosoftExcelと日付を使用する他のプログラムとの間のシリアル日付の互換性が失われます。

動作が修正されないままの場合、発生する問題は1つだけです。

  • WEEKDAY関数は、1900年3月1日より前の日付に対して誤った値を返します。ほとんどのユーザーは1900年3月1日より前の日付を使用しないため、この問題はまれです。
40
user1686

Joel自身が説明した理由は次のとおりです。 My First BillG Review

Basicは1900年1月1日ではなく1899年12月31日をエポックとして使用しますが、何らかの理由で、今日の日付はExcelでもBasicと同じでした。

え?

理由を思い出すのに十分な年齢のExcel開発者を探しに行きました。エドフライスは答えを知っているようでした。

「ああ」と彼は私に言った。 「1900年2月28日をチェックしてください。」

「59歳だ」と私は言った。

「今度は3月1日を試してください。」

「61だ!」

「60はどうなったの?」エドは尋ねました。

「1900年2月29日。うるう年でした。4で割り切れます!」

「良い推測ですが、葉巻はありません」とエドは言い、しばらく疑問に思いました。

おっと。私はいくつかの調査をしました。 100で割り切れる年は、400で割り切れる年でない限り、うるう年ではありません。

1900年はうるう年ではありませんでした。

「これはExcelのバグです!」私は叫んだ。

「まあ、そうでもない」とエドは言った。 「Lotus123ワークシートをインポートできるようにする必要があるため、そのようにする必要がありました。」

「それで、それはLotus 123のバグですか?」

「ええ、でもおそらく意図的なものです。ロータスは640Kに収まらなければなりませんでした。それは多くのメモリではありません。1900を無視すると、右端の2ビットかどうかを確認するだけで、特定の年がうるう年かどうかを判断できます。ロータスの人たちはおそらく、過去2か月間、問題がなくても問題はないと考えていました。

12
Giorgi

これに対する1つの解決策は、年に400年を追加し、次の式のように平日を計算することです= WEEKDAY(DATE(A4 + 400、B4、C4)、1)したがって、A4 = 1834 B4 = 12 C4 = 14これは、1234(日曜日)を返します。これは、2234年12月14日と同じです。これは、グレゴリオ暦への変更の翌年の1753年より前の日付では機能しなくなります。

2
Adrian