Видел на этом форуме как перевести SYSTEMTIME в TDateTime.. http://www.wasm.ru/forum/files/_273393033__st2dt.asm Помогите пожалуйста обратно с переводом TDateTime в SYSTEMTIME
А тебе неременно хочется "ручками", поупражняться в A&0 ? Не проще ли через апишные SystemTimeToFileTime и FileTimeToSystemTime ? Грузишь DateTime в FPU, умножаешь на 24*60*60*10^7 (число 100 нс интервалов в сутках), округляешь до целого и прибавляешь заранее расчитанную дельту - получаешь FILETIME и из него SYSTEMTIME PS: исправил 10000 на 10^7 - опять забыл про микросекунды )
Добрые люди подсказали вот такую процедуру: Код (Text): procedure _DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime); var FT:TFileTime; begin Int64(FT):=Round((DateTime+109205.0)*864000000000.0); FileTimeToSystemTime(FT,SystemTime); end; Правильная ли она?
Да, правильная TDateTime - это вещественное число типа double, представляющее число дней (суток), прошедших с 30.12.1899. Целая часть это число целых суток, а дробная - сотв-но доля суток (т.е. часы, минуты и т.д.). FILETIME это целое число Int64, представляющее собой число 100нс интервалов, прошедших с 1.01.1601. Соответственно для перевода TDateTime в FILETIME нужно 1) прибавить к DateTime разницу дней между 1.01.1601 и 30.12.1899. Эту разницу можно вычислить заранее, задав SYSTEMTIME st = 1.01.1601 и вычислив DayDelta:=-SystemTimeToDateTime(st) = 109205 2) перевести DateTime из дней в 100нс интервалы, умножив на константу 24*60*60*100*100*10=864000000000 PS: Чтобы не связываться с дельфийской SystemTimeToDateTime я предлагал другую последовательность вычислений - сначала умножить, а затем прибавить константу dFT, которая получается просто путем перевода даты 30.12.1899 из st в FT через SystemTimeToFileTime. Этот перевод выглядит более прозрачным (dt=0 соответствует FT=dFT) и не требует SysUtils для вычисления константы. Ну а результат ес-но будет один и тот же
Делаю так потипу вот : Код (Text): .const ConstSystemTimeAdd QWORD 109205 ConstSystemTimeMul QWORD 864000000000 .date FileTime FILETIME <?> SystemTime SYSTEMTIME <?> TDateTime QWORD ? .code ........ fld QWORD PTR TDateTime fild QWORD PTR ConstSystemTimeAdd fadd fild ConstSystemTimeMul fmul fstp FileTime invoke FileTimeToSystemTime,ADDR FileTime,ADDR SystemTime ...... получается в SystemTime чушь какая-то....Притом что TdateTime корректная - 39600, год в результате - дамп SYSTEMTIME 00403090 72 42 0C 00 04 00 14 00 14 00 14 00 1E 00 rB....... 004030A0 1B 02