· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› SYSTEMTIME

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 18, 2004 05:04:03

Вот у меня возникла одна проблема!
У меня есть 2 SYSTEMTIME, в первом дата(и время) раньше чем во втором! Вопрос. Как определить сколько прошло время в часах(, минутах и секундах).


Дата: Янв 18, 2004 05:14:33 · Поправил: Quantum

Вычитанием


Дата: Янв 18, 2004 10:17:19 · Поправил: vaskovich

Можно перегнать их в FILETIME, потом вычесть, потом обратно в SYSTEMTIME. Так даже проще будет :-) Только вычитать придется 64 битные числа (не забыть про перенос).
Структуры гоняются туда-сюда легко: SystemTimeToFileTime и FileTimeToSystemTime


Дата: Янв 18, 2004 13:23:51

2 Quantum: Не всё так просто! Если будет 28 февраля и 1 марта. Как функция вычитания узнает что сегодня высокосный год!??!

2 vaskovich: Уже пробывал. В итогк получитяс 01.01.1601


Дата: Янв 18, 2004 15:57:02 · Поправил: vaskovich

MS считает время с 01.01.1601 :-) Следовательно, ты как-то не так вычел. Попробуй проделай свои преобразования вручную; даже могу дать софтинку для этого.
Вычесть можно на стандартном калькуляторе ;-)

697222059__TimeStruct.exe


Дата: Янв 18, 2004 17:57:47 · Поправил: Black_mirror

Function DateToDay(D,M,G: Word): Longint;
  Label
    X0,X1;
  Const
    Day400 = 146097;
    Day100 = 36524;
    Day4 = 1461;
    Day1 = 365;
    Mes: Array[0..11] Of Word =
      (0,31,59,90,120,151,181,212,243,273,304,334);
    MesV: Array[0..11] Of Word =
      (0,31,60,91,121,152,182,213,244,274,305,335);
    DaysM: Array[1..12] Of Word =
      (31,29,31,30,31,30,31,31,30,31,30,31);
  Var
    RD,A: Longint;
    GS: Word;
  Begin
    If (M > 12) Or (M < 1) Then Goto X0;
    If (D < 1) Or (D > DaysM[M]) Then Goto X0;
    If ((GS Mod 4 <> 0) Or ((GS Mod 100 = 0) And (GS Mod 400 <> 0))) And (M = 2) And (D = 29) Then Goto X0;
    GS := G;
    A := (G-1) Div 400;
    RD := A * Day400;
    G := (G-1) mod 400 + 1;
    A := (G-1) Div 100;
    RD := RD + A * Day100;
    G := (G-1) mod 100 + 1;
    RD := RD + (G-1) Div 4 * Day4;
    G := (G-1) mod 4 + 1;
    RD := RD + (G-1) * Day1;
    If ((GS Mod 4 = 0) And (GS Mod 100 <> 0)) Or (GS Mod 400 = 0)
     Then
      Begin
        RD := RD + MesV[M-1];
        RD := RD + D;
      End
     Else
      Begin
        RD := RD + Mes[M-1];
        RD := RD + D;
      End;
    RetDay := RD;
    Goto X1;
X0:
    RetDay := 0;
X1:
  End;


Дата: Янв 18, 2004 22:49:05

Songoku
Как функция вычитания узнает что сегодня высокосный год!?
А какая разница, если используется UTC?!


Дата: Янв 19, 2004 00:13:49

2 Quantum: Ну приведи пример!


Дата: Янв 19, 2004 03:49:18 · Поправил: q_q

Songoku
2 vaskovich: Уже пробывал. В итогк получитяс 01.01.1601
Это значит, что твои SYSTEMTIME'ы отличаются менее чем на 24 часа и в результирующем SYSTEMTIME'е надо смотреть на
SYSTEMTIME.wHour
SYSTEMTIME.wMinute
SYSTEMTIME.wSecond
SYSTEMTIME.wMilliseconds


Дата: Янв 19, 2004 06:38:45

Songoku
Что-то я перепутал UTC с GMT :-( Вариант с FILETIME должен работать. Ещё в рантайме VC есть функции для преобразования в GMT.


Дата: Янв 19, 2004 17:19:19

Я то то запутался! Приведите пожайлусто простенький пример!


Дата: Янв 19, 2004 20:03:34

union {
   FILETIME ft;
   __int64 t64;
} t1, t2, t3;
SYSTEMTIME st1, st2; // st1 < st2

SystemTimeToFileTime(&st1, &t1.ft);
SystemTimeTiFileTime(&st2, &t2.ft);
t3.t64 = t2.t64 - t1.t64;
FileTimeToSystemTime(&t3.ft, &st1);
// все что надо в st1 :-)


Дата: Янв 20, 2004 10:06:22

2 vaskovich: А как это делается на ассемблере?


Дата: Янв 20, 2004 10:12:32

Songoku
Запусти Си компилятор с ключем -S и получишь asm-код.


Дата: Янв 20, 2004 15:28:24

ft1 FILETIME <>
ft2 FILETIME <>
st1 SYSTEMTIME <>
st2 SYSTEMTIME <> ; st1 < st2
; .. .. ..
invoke SystemTimeToFileTime, offset st1, offset ft1
invoke SystemTimeToFileTime, offset st2, offset ft2
mov eax, ft2.dwLowDateTime
mov edx, ft2.dwHighDateTime
sub eax, ft1.dwLowDateTime
sbb edx, ft1.dwHighDateTime
mov ft2.dwLowDateTime, eax
mov ft2.dwHighDateTime, edx
invoke FileTimeToSystemTime, offset ft2, offset st2

Где-то так; самое общее и понятное решение.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.153