|
|
| Посл.отвђт | Сообщен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_mirrorFunction 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:24ft1 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 Где-то так; самое общее и понятное решение. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.153 |