Короче, DateTime эпоха Excel не является так же, как эпоха DateTime VBA. Несмотря на то, что они являются такой же, как только вы пройти 28 февраля, 1900.
В большинстве современных сред программирования, даты хранятся в виде реальных чисел. Целочисленная часть числа - это число дней с определенной даты согласования в прошлом, называемой эпохой. В Excel, сегодняшний даты, 16 июня 2006 года, хранятся в 38884, считая дни, когда январь первых, 1900 1.
Я начал работать через различные функции даты и времени в Basic и дата и время функции в Excel, пытаясь разобраться, когда я заметил что-то странное в документации Visual Basic: Basic использует 31 декабря 1899 года как эпоху вместо 1 января 1900 года, но по какой-то причине сегодняшняя дата была такой же в Excel как это было в Основные.
Да?
Я пошел искать разработчика Excel, который был достаточно взрослым, чтобы помнить, почему. Эд Фрис, казалось, знал ответ.
«О, - сказал он мне. «Отъезд 28 февраля 1900 года».
«Это 59», - сказал я.
«Теперь попробуйте 1 марта».
"Это 61!"
«Что случилось с 60?» - спросил Эд.
«29 февраля 1900 года был високосным годом, он делится на 4!»
«Хорошая догадка, но без сигары», - сказал Эд, и оставил меня в недоумении от .
К сожалению. Я провел некоторое исследование.Годы, которые делятся на 100, не являются високосными годами, если они также не делятся на 400.
1900 год не был високосным.
«Это ошибка в Excel!» - воскликнул я.
«Ну, не совсем, - сказал Эд. «Мы должны были сделать это, потому что нам нужно , чтобы иметь возможность импортировать рабочие листы Lotus 123».
«Значит, это ошибка в Lotus 123?»
«Да, но, вероятно, преднамеренным один. Лотос был вписываться в 640K. Это не очень много памяти. Если вы игнорируете 1900, вы можете выяснить, если данный год является високосным, просто посмотрев на посмотрите, есть ли в самом начале два бита. Это очень быстро и просто. Лотосы-ребята , вероятно, полагали, что в прошлом было не так, как ошибаться в течение двухмесячного пути . Похоже, что базовые парни хотели быть анальными около этих двух месяцев, поэтому они вернули эпоху в один прекрасный день ».
"Aargh!" Я сказал, и ушел, чтобы изучить, почему в диалоговом окне был установлен флажок, который называется 1904 Date System.
Дополнительная информация
Когда Lotus 1-2-3 был выпущен первый, программа предполагается, что 1900 год был високосным, хотя на самом деле это был не високосный год. Это помогло программе справиться с летальными годами и не повредило почти всем вычислениям дат в Lotus 1-2-3.
Когда Microsoft Multiplan и Microsoft Excel были выпущены, они также предположили, что 1900 год был високосным.Это допущение позволило Microsoft Multiplan и Microsoft Excel использовать одну и ту же систему серийных дат, используемую Lotus 1-2-3, и обеспечить большую совместимость с Lotus 1-2-3. Обработка 1900 года как високосного года также облегчила пользователям перемещение листов из одной программы в другую.
Хотя технически возможно исправить это поведение, так что текущие версии Microsoft Excel не предполагают, что 1900 год является високосным годом, недостатки в этом превышают преимущества.
Если такое поведение должны были быть исправлены, возникнет много проблем, в том числе следующие:
- Почти все даты текущих рабочих листов Microsoft Excel и других документов, будет сокращен на один день. Исправление этого сдвига потребует значительных усилий и времени, особенно в формулах, которые используют даты.
- Некоторые функции, такие как функция WEEKDAY, возвращают разные значения; это может привести к неправильной работе формул в рабочих листах.
- Исправление этого поведения приведет к нарушению совместимости даты и времени между Microsoft Excel и другими программами, использующими даты.
Если поведение остается откорректировано, только одна проблема возникает:
- Функция WEEKDAY возвращает неверные значения дат до 1 марта 1900 г. Поскольку большинство пользователей не используют дат до 1 марта 1900 года, эта проблема редка.
[Дни недели до 1 марта 1900 неверны в Excel] (http://support.microsoft.com/kb/214058/en-us) – GSerg
возможно дубликат [Почему дни недели Excel неправильно за 1900?] (http://superuser.com/questions/481496/why-are-excel-weekdays-wrong-for-1900) – GSerg
ссылка говорит WeekDay, Не знаете, почему это повлияет на DateValue? также ячейка говорит 02/01/1900, но редактор VBA говорит 01/01/1900 о всплывающей подсказке, но на самом деле это 02/01/1900 используется для сравнения - .Range («A1»). Значение <> «01.02.1900» приравнивается к истине, но ячейка говорит, что 02/01/1900 - багги, как ад. –