Установить системную дату

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

В DOS-овском Pascal-е (Borland Pasca 7.0) была функция установки системной даты (даты на компьютере):

procedure SetDate(Year, Month, Day: Word);

То есть, я имею в виду, эта функция меняла ТОЛЬКО дату, не трогая время.
(в DOS-овском Borland C++ также были аналогичные функции)

Пробовал найти подобное в Delphi - нашел лишь функцию (судя по всему, аналог WinAPI-функции) SetLocalTime. Которая устанавливает не только дату, но и время.

Вопрос. Неужели теперь (в Windows-?) нет возможности изменить ТОЛЬКО системную дату?

Заранее спасибо.
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

Что-то не понял, чем тебя не устраивает SetLocalTime. В справке есть подробное описание функции и структуры _SYSTEMTIME.
Ну а вообще, смотрю справку не читаешь. SetSystemTime
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

vunder писал(а):Что-то не понял, чем тебя не устраивает SetLocalTime. В справке есть подробное описание функции и структуры _SYSTEMTIME.
Ну а вообще, смотрю справку не читаешь. SetSystemTime
Я где-то говорил, что не понимаю, как пользоваться функцией SetLocalTime (SetSystemTime - насколько я знаю, аналогичная, за исключением того, что требует гринвичское время)????

А "не устраивает" меня SetLocalTime тем, что (мне казалось, в первом своем сообщении я вполне понятно написал это) там НЕОБХОДИМО (таки, поправь, если я ошибаюсь) устнавливать не только дату, но и текущее ВРЕМЯ. А мне хотелось бы изменить ЛИШЬ ДАТУ (примерно так, как происходит при наборе в командной строке команды date или в упомянутой выше функции DOS-Pascal-я SetDate)
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Да самому написать проще :)

Код: Выделить всё

{ Set UTC (Greenwich) date }
{ Usage notes: }
{ pDay (1-31), pMonth (1-12) pYear (1601-...) }
function SetUTCDate(pDay, pMonth, pYear: Word): Boolean;
var st: TSystemTime;
begin
  Result := False;
  GetSystemTime(st);
  with st do begin
    wDay   := pDay;
    wMonth := pMonth;
    wYear  := pYear;
  end;
  if SetSystemTime(st) then
    Result := True;
end;
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Eugie писал(а):Да самому написать проще :)

Код: Выделить всё

&#123][/quote]
Это все понятно :) Но в этом примере все равно вызывается функция, устанавливающая не только дату, но и время (ведь SetSystemTime поступает именно так, не так ли? :) )
Просто у меня легкий бзик, что между вызовами GetSystemTime и SetSystemTime пройдет некоторый, хотя бы и микроскопически малый промежуток времени (а если еще и выполнять какие-то действия, то, может, и не малый), то есть, после вызова SetSystemTime часы на компьютере уже будет отставать на этот самый промежуток времени. Что несколько коробит пунктуальную душу программиста :)

Кстати, еще раз повторюсь, что в твоем примере, наверное, все-таки, также стоит пользоваться не Get/Set[b]System[/b]Time,  а Get/Set[b]Local[/b]Time
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Но в этом примере все равно вызывается функция, устанавливающая не только дату, но и время (ведь SetSystemTime поступает именно так, не так ли? )
Не так. GetSystemTime инициализирует все поля структуры, а мы меняем только относящиеся к дате.
между вызовами GetSystemTime и SetSystemTime пройдет некоторый, хотя бы и микроскопически малый промежуток времени
Разрешение сист.таймера все одно меньше. Если только не предполагать, что между вызовами Get/SetSystemTime произойдет переключение контекста и планировщик потоков по в этот момент сломается :lol:
стоит пользоваться не Get/SetSystemTime, а Get/SetLocalTime
Без разницы - мы же дату меняем, а не время
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

BBB, имхо, в приведённом примере речь может идти о миллисекундах - если это тебя беспокоит - пора подумать об отпуске ;)
Изображение
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Eugie писал(а):
стоит пользоваться не Get/SetSystemTime, а Get/SetLocalTime
Без разницы - мы же дату меняем, а не время
Имхо, есть тонкости (если угодно - краевые эффекты).
Допустим, сейчас в Москве 2:00 30 августа 2006. Мы хотим установить дату... ну пусть 14 сентября 2006.
Но GetSystemTime вернет гринвичское время, то есть 22:00 (вроде бы, с учетом летнего времени именно 4 часа разница) 29 августа.
Если мы теперть установим поля даты структуры TSystemTime в 14 сентября 2006 и вызовем SetSystemTime, то по местному (московскому) времени получим уже 15 сентября (а не 14, как хотели).
ПО-моему, так.

======================================
Игорь Акопян писал(а):BBB, имхо, в приведённом примере речь может идти о миллисекундах - если это тебя беспокоит -
Ага, именно про это я и толкую :lol: (ну хочется быть пунктуальным по возможности ] пора подумать об отпуске ;) [/quote]Боюсь, не отпустят. Только недели два как вернулся оттуда :D

PS. Эх... А под DOS-ом-то это было возможно! :roll:
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Согласен, интуитивно понятнее задавать локальную дату, а не UTC. Посему изменил имя функции на SetUTCDate :)
Ответить