Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > работа с SYSTEMTIME, FILETIME


Автор: Dmitry_177 17.12.2006, 17:56
Функцией GelLocalTime я узнаю текущее время установленное на компьютере в структуре SYSTEMTIME.. А вот как мне к этому времени прибавить например день, но так что если текущий день будет последним в текущем месяце то и месяц прибавится, так же и с годом... Попробовал сделать так:
Код

var
sysTime: SYSTEMTIME;
begin
 GetLocalTime(sysTime);
 sysTime.wDay := sysTime.wDay + 1;
end;

День прибавляется, но без учета если текущий день будет последним в текущем месяце то и месяц прибавится, так же и с годом, т.е. получается и 32-й и 33-й и т.д.. день в месяце, чего нету на самом деле... Подозреваю что через FILETIME можно это реализовать, но как это сделать, т.е. математику этой структуры я что-то нигде не нашел, нашел единственное что время считается в 100нс, но так я и не понял, там есть dwHighDateTime и dwLowDateTime, и что с этим делать, как это считать? Прошу не посылась в MSDN, читал там...

Автор: dumb 17.12.2006, 22:02
Код

var
 sysTime: SYSTEMTIME;
 filTime: FILETIME;
begin
 GetLocalTime(sysTime);
 SystemTimeToFileTime(sysTime, filTime);
 filTime := FILETIME(Int64(filTime) + 864000000000);
 FileTimeToSystemTime(filTime, sysTime);
end;

Автор: bems 18.12.2006, 01:51
в FILETIME лежит количество 100нс с какой-то средневековой даты, поэтому найти разницу между двумя датами можно, а вот промежуток времени в пару дней конвертировать при помощи SystemTimeToFileTime уже не выйдет. Поэтому придется ручками. Например так:
Код

function AddSystemTimes(var a:SYSTEMTIME;const b:SYSTEMTIME):boolean;

 function DaysInMonth(date:SYSTEMTIME):byte;
 begin
 case date.wMonth of
  4,6,9,11:result:=30;
  2:if (date.wYear mod 4)=0 then result:=29
                            else result:=28;
  else result:=31;
 end
 end;

 procedure AddYear(var a:SYSTEMTIME;const b:word);
 begin
 a.wYear:=a.wYear+b
 end;

 procedure AddMonth(var a:SYSTEMTIME;const b:word);
 var c:DWORD;
 begin
 if b=0 then exit;
 c:=a.wMonth+b-1;
 a.wMonth:=(c mod 12)+1;
 AddYear(a,c div 12);
 end;

 
 procedure AddDay(var a:SYSTEMTIME;const b:word);
 var c,i:DWORD;
 begin
 if b=0 then exit;
 c:=a.wDay+b;
 a.wDay:=0;
 for i:=c DownTo 1 do
  begin
  if a.wDay=DaysInMonth(a)
     then begin
          a.wDay:=1;
          AddMonth(a,1);
          end
     else inc(a.wDay);
  end;
 end;

 procedure AddHour(var a:SYSTEMTIME;const b:word);
 var c:DWORD;
 begin
 if b=0 then exit;
 c:=a.wHour+b;
 a.wHour:=c mod 24;
 AddDay(a,c div 24);
 end;

 procedure AddMinute(var a:SYSTEMTIME;const b:word);
 var c:DWORD;
 begin
 if b=0 then exit;
 c:=a.wMinute+b;
 a.wMinute:=c mod 60;
 AddHour(a,c div 60);
 end;

 procedure AddSecond(var a:SYSTEMTIME;const b:word);
 var c:DWORD;
 begin
 if b=0 then exit;
 c:=a.wSecond+b;
 a.wSecond:=c mod 60;
 AddMinute(a,c div 60);
 end;

 procedure AddMilleseconds(var a:SYSTEMTIME;b:word);
 var c:DWORD;
 begin
 if b=0 then exit;
 c:=a.wMilliseconds+b;
 a.wMilliseconds:=c mod 1000;
 AddSecond(a,c div 1000);
 end;

begin
if (a.wMonth in [1..12]) and
   (a.wDay in [1..DaysInMonth(a)])
   then begin
        AddMilleseconds(a,b.wMilliseconds);
        AddSecond(a,b.wSecond);
        AddMinute(a,b.wMinute);
        AddHour(a,b.wHour);
        AddDay(a,b.wDay);
        AddMonth(a,b.wMonth);
        AddYear(a,b.wYear);
        result:=true
        end
   else result:=false;
end;

а - должно быть корректной датой
b - любой набор полей (все добавляется к а)
день недели не меняется, поэтому вероятно будет неправильным после сложения. Если тебе нада то сконверть результат в FILETIME а потом обратно - день недели установиться  smile

Добавлено @ 01:55 
dumb, хм... вариант  smile

Добавлено @ 02:05 
да, я не боюсь трудностей! smile  smile  smile 

Автор: Romikgy 20.12.2006, 18:04
Код

var
sysTime: SYSTEMTIME;
dt: TDateTime;
begin
 GetLocalTime(sysTime);
 dt:=SystemTimeToDateTime(sysTime);
 dt:=dt+1;
 DateTimeToSystemTime(dt,sysTime);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)