• awkward © (29.07.12 00:04) [0]
    Перепроверил несколько раз... в 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.
  • awkward © (29.07.12 00:13) [1]
    Нашел описание к VCLDate0.
    тогда вопрос: почему нельзя было как-то унифицировать, чтоб не заставлять пользователя самого проделывать дополнительные действия?
  • m-sokolov (Blackman) (01.08.12 16:04) [2]
    В Книге о KOL в разделе 2.4 это расписано.
    Сама книга здесь http://kolmck.net/docs/KOLBook.rar
  • awkward © (01.08.12 23:20) [3]
    да, написано....вот только наоборот...
    >для преобразования из 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 констант

    Пардон, возможно не уменьшения, а увеличения.
Есть новые Нет новых   [118656   +18][b:0][p:0.001]