Страница 1 из 1

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

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

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

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

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

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

Заранее спасибо.

Добавлено: 29 авг 2006, 11:10
vunder
Что-то не понял, чем тебя не устраивает SetLocalTime. В справке есть подробное описание функции и структуры _SYSTEMTIME.
Ну а вообще, смотрю справку не читаешь. SetSystemTime

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

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

Добавлено: 29 авг 2006, 16:00
Eugie
Да самому написать проще :)

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

{ 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;

Добавлено: 29 авг 2006, 16:22
BBB
Eugie писал(а):Да самому написать проще :)

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

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

Кстати, еще раз повторюсь, что в твоем примере, наверное, все-таки, также стоит пользоваться не Get/Set[b]System[/b]Time,  а Get/Set[b]Local[/b]Time

Добавлено: 29 авг 2006, 16:33
Eugie
Но в этом примере все равно вызывается функция, устанавливающая не только дату, но и время (ведь SetSystemTime поступает именно так, не так ли? )
Не так. GetSystemTime инициализирует все поля структуры, а мы меняем только относящиеся к дате.
между вызовами GetSystemTime и SetSystemTime пройдет некоторый, хотя бы и микроскопически малый промежуток времени
Разрешение сист.таймера все одно меньше. Если только не предполагать, что между вызовами Get/SetSystemTime произойдет переключение контекста и планировщик потоков по в этот момент сломается :lol:
стоит пользоваться не Get/SetSystemTime, а Get/SetLocalTime
Без разницы - мы же дату меняем, а не время

Добавлено: 29 авг 2006, 16:34
Игорь Акопян
BBB, имхо, в приведённом примере речь может идти о миллисекундах - если это тебя беспокоит - пора подумать об отпуске ;)

Добавлено: 29 авг 2006, 16:42
BBB
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:

Добавлено: 29 авг 2006, 17:54
Eugie
Согласен, интуитивно понятнее задавать локальную дату, а не UTC. Посему изменил имя функции на SetUTCDate :)