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


Автор: MacTep 1.3.2006, 22:32
Как сменить системное время? Перечитал кучу тем по этому вопросу на форуме, но так ничего конкретно работающего не нашел. Какие будут предложения?

Автор: Yanis 1.3.2006, 22:56
т.е. SetSystemTime тебе не подходит?

Автор: Snowy 1.3.2006, 23:17
Лучше SetLocalTime.

Автор: MacTep 2.3.2006, 22:09
Хотя бы примерчик небольшой...
Я делаю так:
Код

procedure TForm1.BitBtn3Click(Sender: TObject);
var st:TSystemTime;
    temp,now:TDateTime;
    y,mn,d:word;
begin
  now:=EncodeTime(h,m,s,0);
  y:=2006;
  mn:=2;
  d:=27;
  st.wYear:=y;
  st.wMonth:=mn;
  st.wDay:=d;
  temp:=EncodeDate(y,mn,d);
  st.wDayOfWeek:=DayOfWeek(Trunc(temp));
  st.wHour:=h-2;
  st.wMinute:=m;
  st.wSecond:=s;
  st.wMilliseconds:=0;
  SetSystemTime(st);
end;

А все равно не работает. Год устанавливается какой-то странный - 1899 и месяц декабрь. Число 31. Как исправить ошибку?

Автор: Snowy 2.3.2006, 22:27
Ну нагородил. Все намного проще.
Вот, например, устанавливаем дату-время на 2 суток вперед:
Код
var
  st: TSystemTime;
  dt: TDateTime;
begin
  dt := now + 2;
  DateTimeToSystemTime(dt, st);
  SetLocalTime(st);
end;

Автор: Poseidon 2.3.2006, 22:36
Ну не знаю, у меня все меняется:

Код

var st:TSystemTime;
begin
  st.wYear:=2006;
  st.wMonth:=03;
  st.wDay:=01;
  st.wHour:=22;
  st.wMinute:=30;
  st.wSecond:=20;
  SetSystemTime(st);
end;

Автор: Snowy 2.3.2006, 22:36
Цитата(MacTep @ 2.3.2006, 22:09 Найти цитируемый пост)

  now:=EncodeTime(h,m,s,0); // это шутка такая?
  st.wDayOfWeek:=DayOfWeek(Trunc(temp)); // а Trunc зачем?
  st.wHour:=h-2; // а, если сейчас час ночи?
  st.wMinute:=m;  // Ну и чему здесь равны m и s?
  st.wSecond:=s;
  SetSystemTime(st);

Автор: MacTep 2.3.2006, 22:58
Snowy, а если надо на несколько минут назад??? Или часов??? Тогда что?
Цитата

st.wHour:=h-2; // а, если сейчас час ночи?
Не знаю, что ты имел в виду под этим вопросом, но если написать st.wHour:=22 и сменить время, то значение времени будет час ночи. Как это понимать?

Автор: Snowy 3.3.2006, 10:07
Цитата(MacTep @ 2.3.2006, 22:58 Найти цитируемый пост)
Snowy, а если надо на несколько минут назад??? Или часов??? Тогда что?
Код

  now - (1/24 * 2); // на 2 часа назад
  now + (1/24/60 * 5); // на 5 минут вперед


Цитата(MacTep @ 2.3.2006, 22:58 Найти цитируемый пост)
st.wHour:=h-2; // а, если сейчас час ночи?QuoteEndQuoteEEndНе знаю, что ты имел в виду под этим вопросом
Я имел ввиду, что ести ты из часа ночи (если у тебя в h будет 1) вычтешь 2 часа, то получишь 65534 часов.

Автор: MacTep 5.3.2006, 16:14
Код

  now - (1/24 * 2); // на 2 часа назад
  now + (1/24/60 * 5); // на 5 минут вперед
А вот за это спасибо! smile Гениально, по-моему!

Автор: 2maxim 6.3.2006, 20:42
Цитата(Poseidon @ 2.3.2006, 22:36)
Ну не знаю, у меня все меняется:

Код

var st:TSystemTime;
begin
  st.wYear:=2006;
  st.wMonth:=03;
  st.wDay:=01;
  st.wHour:=22;
  st.wMinute:=30;
  st.wSecond:=20;
  SetSystemTime(st);
end;

А как нужно ввести дату из edit , ведь st.wHour - тип word , a edit.text - string?

Автор: MIX55 6.3.2006, 21:30
можно вот так

Код

procedure TForm1.Button1Click(Sender: TObject);
var
St:_SYSTEMTIME;
hToken:THandle;
privValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
begin
//---------Если не хватает привилегий
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken )
then ShowMessage('OpenProcessError');
if not LookupPrivilegeValue( nil, 'SeSystemTimePrivilege', privValue )
then begin
CloseHandle(hToken);
ShowMessage('LookupPriv Error');
end;

tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid := privValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength)
then showmessage('privilege error');
CloseHandle( hToken );

// ------------ увеличиваем год на 1
// возможны и другие варианты
GetSystemTime(St);
inc(St.wYear);
SetSystemTime(st);
end;

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