(Предпосылки) У меня есть программа, которая использует параметризованный запрос в базе данных для поиска по времени суток. Требуемая функциональность означает, что я выполняю несколько поисков, где время является концом дня, поэтому у меня, естественно, есть код, подобный следующему
Query.Parameters[3].Value := TimeOf(EnfOfTheDay(ToTime));
Это не срабатывает из-за ошибки форматирования, потому что время отображается как «31/12/1899». Это демонстрирует следующая консольная программа, которая выводит "31/12/1899" на системную консоль (или эквивалент в ваших региональных настройках).
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, System.DateUtils;
var
V: variant;
Time: TDateTime;
begin
Time := TimeOf(EndOfTheDay(EncodeDate(2017,1,26)));
V := Time;
Write(Output, V);
ReadLn;
end.
Это достаточно легко обойти, но мой вопрос в том, следует ли сообщать в Embarcadero об этой ошибке. Я вижу, что проблема конкретно возникает, когда значение только времени в типе TDateTime сохраняется в варианте, который затем переводится в текст. Времена ранее в течение дня работают нормально, получая строки вроде «23:59».
Если я изменю переменную Time на TTime, тогда результирующая строка будет числовой дробью (т. Е. Вариант не был настроен как значение datetime), но я не понимаю, почему конкретная дробь равна 23:59:59 ( который генерирует EndOfTheDay) интерпретируется как дата 1899 года. Я от природы подозрительно отношусь ко всему, что дает дату пролонгации 1899 из-за особых проблем с продуктами Microsoft, которые могут означать, что это сделано намеренно.