Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с SYSTEMTIME, FILETIME, прибавить любой промежуток времени 
:(
    Опции темы
Dmitry_177
Дата 17.12.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



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

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

День прибавляется, но без учета если текущий день будет последним в текущем месяце то и месяц прибавится, так же и с годом, т.е. получается и 32-й и 33-й и т.д.. день в месяце, чего нету на самом деле... Подозреваю что через FILETIME можно это реализовать, но как это сделать, т.е. математику этой структуры я что-то нигде не нашел, нашел единственное что время считается в 100нс, но так я и не понял, там есть dwHighDateTime и dwLowDateTime, и что с этим делать, как это считать? Прошу не посылась в MSDN, читал там...
PM MAIL   Вверх
dumb
Дата 17.12.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Код

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

PM MAIL   Вверх
bems
Дата 18.12.2006, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



в 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 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Romikgy
Дата 20.12.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

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



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.