Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/163: Рейтинг темы: голосов - 163, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
1

Синхронизация времени с корректировкой

03.05.2017, 16:53. Показов 30108. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте сам я в программировании профан, но реалии жизни вынуждают. Вот решил обратиться к специалистам.
Суть моей проблемы в следующем: как с помощью (CMD/BAT) синхронизировать системное время на компьютере с сервером ntp21.vniiftri.ru (89.109.251.21) и прибавить к нему 5 секунд после синхронизации (5 секунд это для примера, нужно будет подбирать данный параметр опытным путём)? Корректировка не будет превышать 10 секунд.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2017, 16:53
Ответы с готовыми решениями:

Синхронизация времени по локальной сети
Стоит задача синхронизировать точное время по локальной сети в качестве сервера будет компьютер с...

Синхронизация времени Windows Server 2008 с сервером времени
Приветствую. Имеется сервер визуализации (машина с установленной Windows Server 2008). Необходимо...

Синхронизация времени в AD
В общем проблема такая. Пришел на предприятие, а тут 2 DC, и 300 с лихуем компьютеров в AD....

синхронизация времени
доброе утро! я не очень хорошо разобрался с этим, но на сервере win 2008 r2 вводил команду:...

22
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 00:49 2
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@echo off
::<------------------------------------->
:: COPYRIGTH(C) Garry Galler, 2017
:: change_time: смена системного времени посредством указания смещения в секундах от текущего
:: NB!: скрипт не учитывает переход нового времени за границы 23:59:59
:: в этом случае time просто выдаст ошибку
:: батник сохранить в кодировке OEM866
:: Для восстановления правильного времени просто не указывайте offset
::<------------------------------------->
set server=ntp2.stratum2.ru                    & :: сервер для синхронизации
::>nul net stop w32time                          & :: остановка службы времени, чтобы после реконфигурации она подтянула новые параметры
>nul w32tm /config /manualpeerlist:%server%    & :: конфигурация синхронизации
>nul w32tm /config /syncfromflags:manual       & :: ручной режим - не знаю нужно ли
::2>w32tm  /config /largephaseoffset:0         & :: конфигурация максимально допустимого отставания в мск
2>nul net start w32time                        & :: запуск службы времени с новыми параметрами 
>nul  w32tm /config /update                    & :: для смены параметров без остановки службы времени
w32tm /resync                                  & :: синхронизация с указанным сервером
echo ============================
echo сервер синхронизации:
w32tm /query /source
echo ============================
 
set /p offset=[ENTER the offset in seconds]:
if "%offset%"=="" (set /a offset=0)
 
echo ============================
echo ТЕКУЩЕЕ ВРЕМЯ:%time%
echo ============================
set now=%time: =0%
for /f "tokens=1-3 delims=/-:., " %%a in ( "%now%" ) do (
    set hours=%%a   & rem часы
    set minutes=%%b & rem минуты
    set seconds=%%c & rem секунды
)
 
set /a all_seconds= (hours*3600) + (minutes*60) + seconds
echo (%hours% * 3600) + (%minutes% * 60) + %seconds% = %all_seconds%
set /a new_seconds=all_seconds + offset
echo %all_seconds% + %offset% = %new_seconds%
 
set /a seconds = %new_seconds%
set /a hours = seconds/3600 
set /a minutes = (seconds - (hours*3600))/60
set /a seconds = (seconds - (hours*3600) - (minutes*60))
 
set new_time=%hours%:%minutes%:%seconds%
echo ============================
echo НОВОЕ ВРЕМЯ: %new_time%
echo ============================
echo time before: %time%
echo time new:    %new_time%
time %new_time%
echo time after:  %time%
pause&exit /b
------------------------------
Updated.
Изменил блок синхронизации. Чтобы новый сервер подтягивался службой времени ее нужно либо останавливать и после реконфигурации перезапускать, либо использовать параметр /update в w32tm.
2
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
04.05.2017, 07:59  [ТС] 3
Спасибо, всё работает как нужно. С некоторыми параметрами (служб) поэкспериментирую.

Добавлено через 3 часа 59 минут
А как добавить не целые секунды, а с десятыми долями?
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 10:35 4
Цитата Сообщение от lapin9126 Посмотреть сообщение
как добавить не целые секунды, а с десятыми долями?
Просто добавить доли не получится - cmd работает только с целыми числами.
Поэтому нужно формулу расчета времени переводить на миллисекунды - тогда и итоговое время будет с миллисекундами.
Немного попозже попробую перевести.
0
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
04.05.2017, 10:42  [ТС] 5
Заранее благодарен вам за оказанную помощь. Без вас я бы ни за что не не осилил этот вопрос. Если в VBA хоть что-то понятно, то в (CMD/BAT) для меня просто набор знаков
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 10:51 6
В принципе, если вам точный перевод времени не нужен - достаточно просто к итоговой строке времени
Windows Batch file
1
set new_time=%hours%:%minutes%:%seconds%
добавить нужное число миллисекунд
Windows Batch file
1
set new_time=%hours%:%minutes%:%seconds%,25   :: 25 миллисекунд
1
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
04.05.2017, 11:27  [ТС] 7
Спасибо, всё гениальное-просто!!!!!!

Добавлено через 22 минуты
Для корректного суммирования поменял параметр
Windows Batch file
1
set now=%time: =0%
на
Windows Batch file
1
set now=%time%
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 12:21 8
Цитата Сообщение от lapin9126 Посмотреть сообщение
Для корректного суммирования поменял параметр
А вот здесь я не понял :-) Здесь делается замена возможного пробела в числах на 0 (пробел вместо ведущего ноля может появляться во времени до 10 утра).
------------------------------------
Формулу на миллисекунды на перевел, однако подстановка результата дает странный эффект:
Ввожу 1500 миллисекунд.
Код
============================
[ENTER the offset in milliseconds]:1500
============================
ТЕКУЩЕЕ ВРЕМЯ:12:02:59,70
============================
(12    * 3600 * 1000) + (02  * 60 * 1000) + (59  * 1000) + 70 = 43379070
43379070 + 1500 = 43380570
============================
НОВОЕ ВРЕМЯ: 12:3:0,57
============================
time before: 12:02:59,70
time new:    12:3:0,57
time after:  12:03:00,05
Windows Batch file
1
2
3
4
5
6
7
set /a milliseconds = %new_milliseconds%
set /a hours=milliseconds/3600000 
set /a minutes=(milliseconds - (hours*3600*1000))/60/1000
set /a seconds=(milliseconds - (hours*3600*1000) - (minutes*60*1000))/1000
set /a milliseconds=milliseconds - (hours*3600*1000) - (minutes*60*1000) - seconds*1000
 
set new_time=%hours%:%minutes%:%seconds%,%milliseconds:~0,2%
Формула переводит все в миллисекунды, суммирует и конвертирует обратно в часы\минуты\секунды\миллисекунды. И вроде все делает правильно.
Новое время должно быть 12:3:0,57, однако time делает из 57 сотых => 5 сотых. И так постоянно.
Где тут косяк :-)?
0
Любознательный
6546 / 1913 / 333
Регистрация: 10.03.2016
Сообщений: 4,355
04.05.2017, 12:30 9
Garry Galler,
Цитата Сообщение от Garry Galler Посмотреть сообщение
Где тут косяк :-)?
Возможно, не причина, но тем не менее...на первый взгляд:
Цитата Сообщение от Garry Galler Посмотреть сообщение
(12 * 3600 * 1000)
Вот здесь, какие-такие единицы мы получим?
ч*мин*мсек
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 13:50 10
YuS_2,
Ну здесь - (12 * 3600 * 1000) - должно получиться целое число миллисекунд равное 12 часам=43200000.
Разве нет?

Добавлено через 5 минут
А вот с прибавлением + 70 похоже косяк. Там же доли: 70 это 0.7, то есть 700 мск.

Добавлено через 44 минуты
А еще косяк, что числа типа 08 и 09 будут cmd забракованы из-за ведущего ноля. Но это понятно как исправить: добавлением единицы и вычитанием 100.
0
Любознательный
6546 / 1913 / 333
Регистрация: 10.03.2016
Сообщений: 4,355
04.05.2017, 13:55 11
Цитата Сообщение от Garry Galler Посмотреть сообщение
Разве нет?
Да, верно ... это я тут по диагонали, одним глазом форум читаю
3600 равно 60*60, вот где секунды потерялись у меня
0
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
04.05.2017, 14:12  [ТС] 12
Это я не вовремя проверял, надо утром с 8 до 10 тестировать.
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 14:25 13
lapin9126,
Просто замените в коде цикл на этот:
Windows Batch file
1
2
3
4
5
6
set now=%time: =0%
for /f "tokens=1-3 delims=/-:., " %%a in ( "%now%" ) do (
    set /a hours=1%%a-100        & rem часы
    set /a minutes=1%%b-100      & rem минуты
    set /a seconds=1%%c-100      & rem секунды
)
Здесь ненужные ведущие ноли будут убираться и ошибки не случится.
Миллисекунды добавляйте как вы это делаете сейчас - просто помните, что на самом деле вы добавляете не целое число, а сотые доли от секунды.
----------------------------------
Что касается формулы перевода в миллисекунды: мне кажется тут бессмысленно бодаться с time - она воспринимает целое число миллисекунд, которое точно высчитывает формула, как сотую долю от секунды - то есть автоматом это число делит на 100, вместо того, чтобы принять то, что ей дают как готовый отформатированный набор чисел.
0
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
04.05.2017, 14:44  [ТС] 14
Я правильно понял конечный код должен быть такой:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@echo off
::<------------------------------------->
:: COPYRIGTH(C) Garry Galler, 2017
:: change_time: смена системного времени посредством указания смещения в секундах от текущего
:: NB!: скрипт не учитывает переход нового времени за границы 23:59:59
:: в этом случае time просто выдаст ошибку
:: батник сохранить в кодировке OEM866
:: Для восстановления правильного времени просто не указывайте offset
::<------------------------------------->
set server=ntp2.stratum2.ru                    & :: сервер для синхронизации
::>nul net stop w32time                          & :: остановка службы времени, чтобы после реконфигурации она подтянула новые параметры
>nul w32tm /config /manualpeerlist:%server%    & :: конфигурация синхронизации
>nul w32tm /config /syncfromflags:manual       & :: ручной режим - не знаю нужно ли
::2>w32tm  /config /largephaseoffset:0         & :: конфигурация максимально допустимого отставания в мск
2>nul net start w32time                        & :: запуск службы времени с новыми параметрами 
>nul  w32tm /config /update                    & :: для смены параметров без остановки службы времени
w32tm /resync                                  & :: синхронизация с указанным сервером
echo ============================
echo сервер синхронизации:
w32tm /query /source
echo ============================
 
set /p offset=[ENTER the offset in seconds]:
if "%offset%"=="" (set /a offset=0)
 
echo ============================
echo ТЕКУЩЕЕ ВРЕМЯ:%time%
echo ============================
set now=%time: =0%
for /f "tokens=1-3 delims=/-:., " %%a in ( "%now%" ) do (
    set /a hours=1%%a-100        & rem часы
    set /a minutes=1%%b-100      & rem минуты
    set /a seconds=1%%c-100      & rem секунды
)
 
set /a all_seconds= (hours*3600) + (minutes*60) + seconds
echo (%hours% * 3600) + (%minutes% * 60) + %seconds% = %all_seconds%
set /a new_seconds=all_seconds + offset
echo %all_seconds% + %offset% = %new_seconds%
 
set /a seconds = %new_seconds%
set /a hours = seconds/3600 
set /a minutes = (seconds - (hours*3600))/60
set /a seconds = (seconds - (hours*3600) - (minutes*60))
 
set new_time=%hours%:%minutes%:%seconds%,25   & :: 25 миллисекунд
echo ============================
echo НОВОЕ ВРЕМЯ: %new_time%
echo ============================
echo time before: %time%
echo time new:    %new_time%
time %new_time%
echo time after:  %time%
pause&exit /b
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
04.05.2017, 15:24 15
Да, пока это все что я могу предложить.
P.S. Пробелы в присвоениях переменных - до и после знака равно - лучше убрать. Они в батниках как минимум нежелательны, как максимум приводят к ошибкам, хотя при сложении чисел вроде не влияют. Это у меня python code style уже мешает батники правильно писать :-)
0
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
05.05.2017, 04:22  [ТС] 16
Хорошо, подправлю. Еще раз благодарю за помощь.

Добавлено через 12 часов 15 минут
Протестировал сегодня утром с 8 часов. 08 в CMD считает 8-ричной системой счисления и вот что получается. Надо искать альтернативный метод.

Отправка команды синхронизации на локальный компьютер
Команда выполнена успешно.
============================
сервер синхронизации:
ntp2.stratum2.ru
============================
[ENTER the offset in seconds]:5
============================
ТЕКУЩЕЕ ВРЕМЯ: 8:19:00,15
============================
(08 * 3600) + (19 * 60) + 00 = 1140
1140 + 5 = 1145
============================
НОВОЕ ВРЕМЯ: 0:19:5
============================
time before: 8:19:00,16
time new: 0:19:5
time after: 0:19:04,99
Для продолжения нажмите любую клавишу . . .
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
05.05.2017, 15:10 17
lapin9126,
Синхронизация времени с корректировкой

Откуда у вас ведущий ноль, если батник его исключает операций вычитания 108 - 100=8?
0
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
05.05.2017, 15:47  [ТС] 18
Да кто его знает. Может в коде что-то не так. Спасибо за помощь. Пытаюсь на VBS написать.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
@echo off
::<------------------------------------->
:: COPYRIGTH(C) Garry Galler, 2017
:: change_time: смена системного времени посредством указания смещения в секундах от текущего
:: NB!: скрипт не учитывает переход нового времени за границы 23:59:59
:: в этом случае time просто выдаст ошибку
:: батник сохранить в кодировке OEM866
:: Для восстановления правильного времени просто не указывайте offset
::<------------------------------------->
::set offset=6                                   & :: секунды коррекции после подбора
set server=ntp2.stratum2.ru                    & :: сервер для синхронизации
::>nul net stop w32time                        & :: остановка службы времени, чтобы после реконфигурации она подтянула новые параметры
>nul w32tm /config /manualpeerlist:%server%    & :: конфигурация синхронизации
>nul w32tm /config /syncfromflags:manual       & :: ручной режим - не знаю нужно ли
::2>w32tm  /config /largephaseoffset:0         & :: конфигурация максимально допустимого отставания в мск
2>nul net start w32time                        & :: запуск службы времени с новыми параметрами 
>nul  w32tm /config /update                    & :: для смены параметров без остановки службы времени
w32tm /resync                                  & :: синхронизация с указанным сервером
echo ============================
echo сервер синхронизации:
w32tm /query /source
echo ============================
 
set /p offset=[ENTER the offset in seconds]: & :: секунды коррекции методом подбора
if "%offset%"=="" (set /a offset=0)
 
echo ============================
echo ТЕКУЩЕЕ ВРЕМЯ:%time%
echo ============================
set now=%time: =0%
for /f "tokens=1-3 delims=/-:., " %%a in ( "%now%" ) do (
    set hours=%%a   & rem часы
    set minutes=%%b & rem минуты
    set seconds=%%c & rem секунды
)
 
set /a all_seconds=(hours*3600) + (minutes*60) + seconds
echo (%hours% * 3600) + (%minutes% * 60) + %seconds% = %all_seconds%
set /a new_seconds=all_seconds + %offset%
echo %all_seconds% + %offset% = %new_seconds%
 
set /a seconds=%new_seconds%
set /a hours=seconds/3600 
set /a minutes=(seconds - (hours*3600))/60
set /a seconds=(seconds - (hours*3600) - (minutes*60))
 
set new_time=%hours%:%minutes%:%seconds%
echo ============================
echo НОВОЕ ВРЕМЯ: %new_time%
echo ============================
echo time before: %time%
echo time new:    %new_time%
time %new_time%
echo time after:  %time%
pause&exit /b
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
05.05.2017, 15:59 19
lapin9126,
Ну вы же используете первую версию кода, которая не содержит исправления ошибки ведущего нуля.
Вот в этом посте вы же сами прикрепили правильную версию кода, в которую внесены мои поправки переменных. И эту версию вы почему-то НЕ используете...
0
2 / 2 / 0
Регистрация: 19.10.2015
Сообщений: 185
05.05.2017, 16:17  [ТС] 20
Прошу прощения, с утра наверно еще не проснулся и не то скопировал.
0
05.05.2017, 16:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2017, 16:17
Помогаю со студенческими работами здесь

Синхронизация времени клиентов с сервером
Приветствую. Есть такая задача. &quot;Пляшут&quot; часики у меня на клиентах. Клиенты в основном на ХР, но...

Синхронизация времени между серверами
Здравствуйте, имеется несколько серверов с Windows Server 2003 на борту, находятся они в одной...

Синхронизация времени Windows server 2003
Подскажите, что может быть Каждые полчаса сервер выдает такие ошибки: NTP-клиент поставщика...

Синхронизация времени контроллера домена от рабочей станции
Доброго времени суток форумчане. Кто сможет, подскажите как реализовать: Имеется контроллер...

Синхронизация времени с внешним NTP сервером в Windows Server 2008 R2
Доброго времени суток. Подскажите решение проблемы. Суть в том, что на домен контроллере (DC) часы...

Windows Server 2008 R2 синхронизация времени с сервером ntpd в локальной сети
Не работает синхронизация времени в WS 2008 R2. Настройки прилетают от dhcp-сервера на linux, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru