Необходимо получить дату -1 день от текущей. Вроде бы логично: - получить системную дату в FILETIME; - вычесть C92A69C000h (24 часа); - конвертировать в SYSTEMTIME. Но не совсем: ПРИМЕР- дата 05.02 (в результате получаем 04.02), стрелки переваливают за 0.00 , а результат как был 05.02 так и остался. Требуемая дата получается после 2.00 (точно не установлено). Может кто знает, чем же дело? Или может есть более разумный способ решения, обошедший меня стороной?
Zloiment Т.е. примерно так: Код (Text): push offset ft call GetSystemTimeAsFileTime mov eax,ft.dwLowDateTime mov edx,ft.dwHighDateTime sub eax,0C92A69C000h sbb edx,0 mov ft.dwLowDateTime,eax mov ft.dwHighDateTime,edx Так должно работать.
Значение 0C92A69C000h - выходит за 32-разрядность. push offset ft call GetSystemTimeAsFileTime mov eax,ft.dwLowDateTime mov edx,ft.dwHighDateTime sub eax,2A69C000h sbb edx,0C9h mov ft.dwLowDateTime,eax mov ft.dwHighDateTime,edx
Точно. Других, более разумных, способов решения, AFAIK, нет и этот код я взял как раз из борландовского примера, так что глюк должен быть где-то в другом месте...
Zloiment Эврика! Итак, вот тестовый код: Код (Text): SYSTEMTIME st; FILETIME ft; void main(void){ GetLocalTime(&st); SystemTimeToFileTime(&st,&ft); __asm{ mov eax,ft.dwLowDateTime mov edx,ft.dwHighDateTime sub eax,2A69C000h sbb edx,0C9h mov ft.dwLowDateTime,eax mov ft.dwHighDateTime,edx } wsprintf(buffer,"%d/%.2d/%.2d %.2d:%.2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute); MessageBox(0,buffer,0,0); FileTimeToSystemTime(&ft,&st); wsprintf(buffer,"%d/%.2d/%.2d %.2d:%.2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute); MessageBox(0,buffer,0,0); ExitProcess(0); } Так что, если вам нужно то время, что на часах в трее, то надо использовать LocalTime, а не SystemTime.
Quantum Так что, если вам нужно то время, что на часах в трее, то надо использовать LocalTime, а не SystemTime. Только с отниманием одних суток все-таки нужно быть очень осторожным. В России и некоторых других странах два раза в год "местные" сутки не равны 24-м часам из-за переходов на летнее\зимнее время (поубивал бы гадов)! А вот с UTCшными такой проблемы нет.