Перевод времени в UTC

Тема в разделе "WASM.WIN32", создана пользователем Zloiment, 5 фев 2005.

Статус темы:
Закрыта.
  1. Zloiment

    Zloiment New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    5
    Адрес:
    Moscow
    Необходимо получить дату -1 день от текущей. Вроде бы логично:

    - получить системную дату в FILETIME;

    - вычесть C92A69C000h (24 часа);

    - конвертировать в SYSTEMTIME.

    Но не совсем: ПРИМЕР- дата 05.02 (в результате получаем 04.02), стрелки переваливают за 0.00 , а результат как был 05.02 так и остался. Требуемая дата получается после 2.00 (точно не установлено). Может кто знает, чем же дело? Или может есть более разумный способ решения, обошедший меня стороной?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Zloiment



    А вычитание происходит с учётом того, что FILETIME - это 64-битное число?
     
  3. Zloiment

    Zloiment New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    5
    Адрес:
    Moscow
    Ну да - sub eax,ecx sbb edx,ebx (пара edx:eax-ebx:ecx)
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Zloiment

    Т.е. примерно так:
    Код (Text):
    1. push offset ft
    2. call GetSystemTimeAsFileTime
    3. mov eax,ft.dwLowDateTime
    4. mov edx,ft.dwHighDateTime
    5. sub eax,0C92A69C000h
    6. sbb edx,0
    7. mov ft.dwLowDateTime,eax
    8. mov ft.dwHighDateTime,edx
    Так должно работать.
     
  5. Zloiment

    Zloiment New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    5
    Адрес:
    Moscow
    Значение 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
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Точно. Других, более разумных, способов решения, AFAIK, нет и этот код я взял как раз из борландовского примера, так что глюк должен быть где-то в другом месте...
     
  7. Zloiment

    Zloiment New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    5
    Адрес:
    Moscow
    Странно, ладно спасибо будем поискать
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Zloiment

    Эврика!



    Итак, вот тестовый код:
    Код (Text):
    1. SYSTEMTIME st;
    2. FILETIME ft;
    3.  
    4. void main(void){
    5.  GetLocalTime(&st);
    6.  SystemTimeToFileTime(&st,&ft);
    7.  __asm{
    8.   mov eax,ft.dwLowDateTime
    9.   mov edx,ft.dwHighDateTime
    10.   sub eax,2A69C000h
    11.   sbb edx,0C9h
    12.   mov ft.dwLowDateTime,eax
    13.   mov ft.dwHighDateTime,edx
    14.  }
    15.  wsprintf(buffer,"%d/%.2d/%.2d %.2d:%.2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute);
    16.  MessageBox(0,buffer,0,0);
    17.  FileTimeToSystemTime(&ft,&st);
    18.  wsprintf(buffer,"%d/%.2d/%.2d %.2d:%.2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute);
    19.  MessageBox(0,buffer,0,0);
    20.  ExitProcess(0);
    21. }
    Так что, если вам нужно то время, что на часах в трее, то надо использовать LocalTime, а не SystemTime.
     
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Quantum

    Так что, если вам нужно то время, что на часах в трее, то надо использовать LocalTime, а не SystemTime.



    Только с отниманием одних суток все-таки нужно быть очень осторожным. В России и некоторых других странах два раза в год "местные" сутки не равны 24-м часам из-за переходов на летнее\зимнее время (поубивал бы гадов)! А вот с UTCшными такой проблемы нет.
     
  10. Zloiment

    Zloiment New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    5
    Адрес:
    Moscow
    Спасибо, Quantum. Действительно, все работает как часы.:)
     
Статус темы:
Закрыта.