К списку форумов К списку вопросов
Проблема системного времени (Delphi)
Yuriy VP
06.05.2004 - 12:10
Здравствуйте !
В проекте, в одном из экранов необходимо отображение системного времени, и возможность его изменения , как опция настройки. Использовался код, позаимствованый на кулибе (с) :
{**************************************************************************
Функция SetPCSystemTime изменяет системную дату и время.
Параметр(ы) : StrTime - Новoe дата и время
Возвращаемые значения: True - успешное завершение
False - метод несработал
*********************************************************}
FUNCTION SetPCSystemTime(StrTime:String): Boolean;
VAR {----------------------------------------------------}
tDati: TDateTime;
tSetDati: TDateTime;
vDatiBias: Variant;
tTZI: TTimeZoneInformation;
tST: TSystemTime;
BEGIN {--------------------------------------------------}
 tDati := StrToDateTimeDef(StrTime,Now);
 GetTimeZoneInformation(tTZI);
 vDatiBias := tTZI.Bias / 1440;
 tSetDati := tDati + vDatiBias;
 WITH tST DO BEGIN
 wYear := StrToInt(FormatDateTime('yyyy', tSetDati));
 wMonth := StrToInt(FormatDateTime('mm', tSetDati));
 wDay := StrToInt(FormatDateTime('dd', tSetDati));
 wHour := StrToInt(FormatDateTime('hh', tSetDati));
 wMinute := StrToInt(FormatDateTime('nn', tSetDati));
 wSecond := StrToInt(FormatDateTime('ss', tSetDati));
 wMilliseconds := 0;
END;
SetPCSystemTime := SetSystemTime(tST);
END; {--------------------------------------------------}
**********************************************************************************
Все хорошо...до перевода часов на летнее время. После этого возникла проблема : при изменении системного времени из проекта (не средствами ОС, а именно из программы) , происходит автоматическое прибавление на 1 час. К примеру выставляем 15.20 , после сэйва видим 16.20.
Прибавление происходит только в "летний период". Если "сказать" что сейчас январь, а не апрель, все будет работать нормально.
"Нежелаемое" изменение происходит в строке " SetPCSystemTime := SetSystemTime(tST); ", может кто подскажет расширенное описание этой функции (хелп не помог), непонятно почему происходит добавление этого часа.
Всем ответившим заранее спасибо.
madcreep
1 - 06.05.2004 - 13:57
хм. вот что нашел в MSDN по функции SetLocalTime:
 
Windows Server 2003, Windows XP/2000/NT: The system uses UTC internally. Therefore, when you call SetLocalTime, the system uses the current time zone information to perform the conversion, including the daylight saving time setting. Note that the system uses the daylight saving time setting of the current time, not the new time you are setting. Therefore, to ensure the correct result, call SetLocalTime a second time, now that the first call has updated the daylight saving time setting.
Собственно, попробуй вызвать ф-цию повторно: SetPCSystemTime := SetSystemTime(tST);
Хотя, в МСДН ничего такого о SetSystemTime не написано.
1111
2 - 07.05.2004 - 09:05
А в Win убрать переход на летнее время ?
VaS
3 - 07.05.2004 - 11:23
procedure SetPCSystemTime(const StrTime: string);
var
  DT: TDateTime;
  ST: TSystemTime;
begin
  DT := StrToDateTimeDef(StrTime, 0);
  if DT = 0 then
    raise Exception.Create('Error date string');
  DateTimeToSystemTime(DT, ST);
  if not SetLocalTime(ST) then
    raise Exception.Create('Error set time (' + IntToStr(GetLastError) + ')');
end;
Alecha
4 - 23.05.2004 - 01:35
Перед началом вызова процедуры заблокируй доступ к таймеру по окончанию открой и всё получиться
hkm
5 - 23.05.2004 - 22:21
(4) :-) Неужели обновление системных часов столь продолжительная задача? :-)
(0) Результат GetTimeZoneInformation(tTZI); выглядит нормально? Т.е. для летнего GMT+4, для зимнего GMT+3 или всё время GMT+3? Да и вообще(IMHO) лучше работу по переводу местного времени в GMT и обратно взвалить на ОС(Set/Get System/Local Time)/
(3) Возможно, для данной задачи это не важно, но при "переходе" на зимнее/летнее(если до перевода часов одно время, а после - другое) время SetLocalTime ведёт себя немного непредсказуемо (для пользователя). Подробнее см MSDN.

К списку вопросов на форуме Программирование

>>