-
Перепроверил несколько раз... в KOL есть интересный комментарий:
//TDateTime = Double; // well, it is already defined so in System.pas
{* Basic date and time type. Integer part represents year and days (as is,
i.e. 1-Jan-2000 is representing by value 730141, which is a number of
days from 1-Jan-0001 to 1-Jan-2000 inclusively). Fractional part is
representing hours, minutes, seconds and milliseconds of a day
proportionally (like in VCL TDateTime type, e.g. 0.5 = 12:00, 0.25 = 6:00,
etc.). }
Но тем не менее, вся информация о дельфи утверждает:
The integral part of a TDateTime value is the number of days that have passed since 12/30/1899
Из-за этого возникает проблема.... DateTime2SystemTime работает некорректно при любых условиях, что DATE0_0001, что DATE0_1601. Причем, дата, которая самой дельфи показывается как нормальная, порождает result=false в случае DATE0_1601 и просто неправильный год (смещение от 1899) и даже день (смещенный на два, 21 вместо 19) для DATE0_0001.
Проверял и на Delphi 5, и на Delphi XE2. -
Нашел описание к VCLDate0.
тогда вопрос: почему нельзя было как-то унифицировать, чтоб не заставлять пользователя самого проделывать дополнительные действия? -
m-sokolov (Blackman) (01.08.12 16:04) [2]В Книге о KOL в разделе 2.4 это расписано.
Сама книга здесь http://kolmck.net/docs/KOLBook.rar -
да, написано....вот только наоборот...
>для преобразования из KOL'овской даты в VCL'евскую достаточно прибавить константу VCLDate0
а мне приходится добавлять константу для преобразования VCL даты в KOLвскую... -
Netspirit (29.06.17 13:53) [4]Такой вопрос. Почему при включенной директиве DATE0_0001 этот кодvar
ST: TSystemTime;
DT: TDateTime;
begin
FillChar(ST, SizeOf(ST), 0);
ST.wYear := 1;
ST.wMonth := 1;
ST.wDay := 1;
SystemTime2DateTime(ST, DT);
end;
выдаёт в результате DT = 1.0?
Поскольку начальной датой принято 01.01.0001 00:00:00, то эта дата в формате TDateTime должна быть равной 0.0.
Тогда 02.01.0001 было бы равно 1.0 и т.д.
Предполагаю, в функции SystemTime2DateTime нужно уменьшать ST.wDay на 1. Кроме того, это потребует уменьшения на 1 констант Date1601 и VCLDate0. -
Netspirit (29.06.17 13:55) [5]
> Кроме того, это потребует уменьшения на 1 констант
Пардон, возможно не уменьшения, а увеличения.