|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Как получить текущую дату и время в интернете? |
|
Любой язык - [решено] Как получить текущую дату и время в интернете?
|
Новый участник Сообщения: 29 |
Возникла проблема, не знаю как организовать/получить время из вне, из интернета VBS
|
|
Отправлено: 16:18, 01-03-2012 |
Ветеран Сообщения: 1758
|
Если необходимо взять время именно из какого-либо онлайн-таймсервиса, то используй его API.
|
Отправлено: 21:05, 02-03-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Foreigner, вполне бы сгодилось что-нибудь наподобие такого, только со временем. Можно, конечно, вычленять, например, из подобных: Current local time in Moscow City, Russia страниц, но хотелось бы попроще. Вам не попадалось?
white155, Вам нужно настроить привязку к ntp-серверу и синхронизировать время? |
Отправлено: 23:13, 02-03-2012 | #3 |
Ветеран Сообщения: 1758
|
Iska, я не интересовался этим, за ненадобностью. timeapi.org -- первое что попадается по запросу "time api"
|
Отправлено: 08:48, 03-03-2012 | #4 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Мне необходимо при запуске пакетного файла BAT или VBS узнать текущее время из интернета, чтобы в дальнейшем например сравнивать его с временем компьютера и производить другие действия.
Вся проблема в том что не знаю как работать с API или делать привязки к ntp-серверу и синхронизировать время, как мне предлагали сделать выше |
|
Отправлено: 01:39, 04-03-2012 | #5 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать white155, вот, набросал для вас bat-скрипт, который использует timeapi.org. Для его работы нужен wget, рядом со скриптом нужно создать директорию bin и поместить wget и требуемые им библиотеки туда. В результате работы скрипта вы получите вот это:
![]() Только не забудьте указать свой часовой пояс (сверху, переменная UTCZone). @Echo Off Echo %Path%|Find "%CD%\bin">nul||Set Path=%Path%;%CD%\bin Set TimeAPI=http://www.timeapi.org/utc/now Set UTCZone=+2 :: Получаем время, поправка на пинг до сервера не делается, т.к. время отдается с точностью до секунды, а это допустимая погрешность Wget -U "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2" --timeout=2 --tries=1 %TimeAPI% >&2 2>nul :: Выделяем время HH:MM:SS из полученной строки For /F "tokens=2 delims=T+" %%A In (now) Do (Set UTCTime=%%A&Del now) :: Сериализуем его Call :ParseTimestamp %UTCTime% Call :SerializeTime Set S_UTCTime=%ErrorLevel% :: Работаем с часовым поясом Set /A S_Shift=%UTCZone:~1%*60*60 If "%UTCZone:~,1%"=="+" ( Call :TPlus %S_UTCTime% %S_Shift% ) Else ( Call :TMinus %S_UTCTime% %S_Shift% ) Set S_UTCZone=%Result% :: И наконец, получаем текущее время компьютера Call :ParseTimestamp %time:~-0,8% Call :SerializeTime Set S_LocalTime=%ErrorLevel% :: Выводим все данные на экран Echo. Call :DeserializeTime %S_UTCTime% Echo Время UTC: %DHH%:%DMM%:%DSS% Call :DeserializeTime %S_UTCZone% Echo Время UTC, часовой пояс %UTCZone%: %DHH%:%DMM%:%DSS% Call :DeserializeTime %S_LocalTime% Echo Время этого компьютера: %DHH%:%DMM%:%DSS% Echo. Pause Exit ::===Функции работы со временем в .bat==================================== :: Anonymous, 2010 :ParseTimestamp :: Разбирает на составляющие временную метку формата ЧЧ:ММ:СС :: Формат: Call :ParseTimestamp (время) :: К примеру - Call :ParseTimestamp %time:~-0,8% :: Вывод - в переменные HH MM и SS For /F "tokens=1,2,3 delims=:" %%A In ("%1") Do ( Set HH=%%A Set MM=%%B Set SS=%%C ) :SerializeTime :: Сериализует время из переменных HH MM и SS :: Вывод - в ErrorLevel Set /A STime=(HH*60*60)+(MM*60)+SS Exit /B %STime% :DeserializeTime :: Десериализует время, приводит его к стандартному формату :: Формат: Call :DeserializeTime (сериализованное время) :: Вывод - в переменные DHH DMM и DSS Set /A DHH=%1/60/60 Set /A DMM=(%1/60)-(DHH*60) Set /A DSS=%1-(DHH*60*60)-(DMM*60) If %DHH%==24 Set DHH=00 If %DHH% LSS 10 Set DHH=0%DHH% If %DMM% LSS 10 Set DMM=0%DMM% If %DSS% LSS 10 Set DSS=0%DSS% Exit /B :TMinus :: Функция вычитания для сериализованного времени :: Формат: Call :TMinus (сериализованное время) (сколько секунд отнять) :: Вывод - в ErrorLevel Set /A Result=%~1-%~2 If %~2 GTR %~1 ( Set /A Result=86400+%~1-%~2 ) Exit /B %Result% :TPlus :: Функция прибавления для сериализованного времени :: Формат: Call :TPlus (сериализованное время) (сколько секунд прибавить) :: Вывод - в ErrorLevel Set /A Result=%~1+%~2 If %Result% GTR 86400 ( Set /A Result=%~1+%~2-86400 ) Exit /B %Result% :Timer :: Отсчитывает прошедшее с заданного момента время :: Формат: Call :Timer (запомненное сериализованное время) :: Вывод - в ErrorLevel :: Если счетчик переходит границу суток, число дней возрастает на 1 :: Дни выводятся в переменную ED (и накапливаются) // да, знаю, что костыль и быдлокод Set OTime=%1 If "%ED%"=="" Set ED=0 Call :ParseTimestamp %time:~-0,8% Call :SerializeTime Set CTime=%ErrorLevel% If %OTime% GTR %CTime% ( Set /A Timer=86400-%OTime%+%CTime% Set /A ED+=1 ) Else ( Set /A Timer=CTime-OTime ) Exit /B %Timer% :Timer2 :: Проверяет, прошел ли заданный промежуток времени :: Формат: Call :Timer2 (запомненное сериализованное время) (промежуток в секундах) :: Вывод - в ErrorLevel (только 0=промежуток истёк или 1=промежуток ещё не истёк) Call :ParseTimestamp %time:~-0,8% Call :SerializeTime Call :TMinus %ErrorLevel% %1 If %2 GTR %ErrorLevel% Exit /B 1 Exit /B 0 ::======================================================================== |
Отправлено: 03:42, 04-03-2012 | #6 |
Сообщения: 53488
|
Профиль | Отправить PM | Цитировать Если батником, можно с помощью утилиты cmdtime3.exe
@Echo Off Set Servers=ntp2.sth.netnod.se ntp2.sp.se Time2.Stupi.SE Set D= Set T= For /F "Tokens=4,5" %%I In ('cmdtime3.exe %Servers% ^| Find "Suggested"') Do ( Set D=%%I Set T=%%J ) If Defined D ( Echo Дата: %D% Echo Время: %T% ) Else ( Echo Ошибка: не удалось определить дату/время. ) Цитата white155:
|
|
Отправлено: 08:03, 04-03-2012 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Anonymоus:
|
|
Отправлено: 14:35, 04-03-2012 | #8 |
Старожил Сообщения: 207
|
Профиль | Отправить PM | Цитировать Цитата Anonymоus:
Цитата Anonymоus:
В демке функцией :GetFleInfo[] в переменные ArcFile.* записывается информация о данном bat-файле, которая затем выводится на экран. Нас интересуют ArcFile.DTSec (дата-время файла в секундах), ArcFile.ModifyedSecAgo (сколько секунд назад файл был модифицирован, получается вычитанием "текущая дата-время в секундах" - "дата-время модифицирования файла в секундах"). Собственно перевод в секунды - :DateTime2Seconds[] Ограничения. 32х битов достаточно для представления в секундах даты-времени в диапазоне 1980....2048, при острой необходимости можно переделать на двухсекундные кванты и так далее. В даном варианте секунды в дате-времени файла всегда равны 00 (для меня это некритично), файлы до 1980 года будут иметь дату-время в секундах ноль, старше 2048 - максимальное положительное 32битное со знаком. (что для меня тоже приемлемо, как "МНОГО" для папуаса для обозначения количества, большего десяти) @echo off :: (C) CyberMuesli, 2012 :demo setlocal enabledelayedexpansion if not %errorlevel%==0 ( echo ERROR: setlocal enabledelayedexpansion exit /b 1 ) call :GetFileInfo[] .\%~nx0 ArcFile call :DisplayFileInfo[] ArcFile goto :eof ::=========================================================================== :DateTime2Seconds[] ::=========================================================================== :: %1="DD.MM.YYYY HH:MM:SS" %2=VarName set dt2s.Param=%~1 set dt2s.Year=!dt2s.Param:~6,4! set dt2s.Month=!dt2s.Param:~3,2! set dt2s.Day=!dt2s.Param:~0,2! set dt2s.HH=!dt2s.Param:~11,2! set dt2s.MM=!dt2s.Param:~14,2! set dt2s.SS=!dt2s.Param:~17,2! if %dt2s.Year% LSS 1980 ( set %2=0 goto :eof ) if %dt2s.Year% GEQ 2048 ( set /a %2=0x7FFFFFF+0 goto :eof ) set S01=0 set /a S02=S01 + 31 * 86400 set /a S03=S02 + 28 * 86400 set /a S04=S03 + 31 * 86400 set /a S05=S04 + 30 * 86400 set /a S06=S05 + 31 * 86400 set /a S07=S06 + 30 * 86400 set /a S08=S07 + 31 * 86400 set /a S09=S08 + 31 * 86400 set /a S10=S09 + 30 * 86400 set /a S11=S10 + 31 * 86400 set /a S12=S11 + 30 * 86400 call :LeapCount[] %dt2s.Day%.%dt2s.Month%.%dt2s.Year% call :Trim1st0[] %dt2s.Day% dt2s.Day call :Trim1st0[] %dt2s.HH% dt2s.HH call :Trim1st0[] %dt2s.MM% dt2s.MM call :Trim1st0[] %dt2s.SS% dt2s.SS Set /a %2=((%dt2s.Year%-1980)*31536000) + S%dt2s.Month% + (%dt2s.Day%-1+%LeapCount%)*86400 + %dt2s.HH%*3600 + %dt2s.MM%*60 + %dt2s.SS% goto :eof ::=========================================================================== :GetFileInfo[] ::=========================================================================== :: %1: filename %2: VarName :: return: VarName.Origin VarName.Drive VarName.Path... etc set %2.Origin=%1 for %%i in (%1) do ( set %2.Drive=%%~di set %2.Path=%%~pi set %2.DPath=%%~dpi set %2.PNX=%%~fi set %2.NX=%%~nxi set %2.DT=%%~ti set %2.Size=%%~zi ) if not "!%2.DT!"=="" ( set %2.Year=!%2.DT:~6,4! set %2.Month=!%2.DT:~3,2! set %2.Day=!%2.DT:~0,2! set %2.HH=!%2.DT:~11,2! set %2.MM=!%2.DT:~14,2! set %2.SS=00 call :DateTime2Seconds[] "%DATE% %TIME%" Now.DTSec call :DateTime2Seconds[] "!%2.DT!.00" %2.DTSec set /a %2.ModifyedSecAgo=Now.DTSec-%2.DTSec ) goto :EOF ::=========================================================================== :Trim1st0[] ::=========================================================================== :: %1=string %2=var if "%1"=="0" ( set %2=%1 goto :eof ) set String=%1 set Char=!String:~0,1! if "!Char!"=="0" ( set %2=!String:~1! ) else ( set %2=%1 ) goto :eof ::=========================================================================== :DisplayFileInfo[] ::=========================================================================== echo %1.Origin !%1.Origin! echo %1.Drive !%1.Drive! echo %1.Path !%1.Path! echo %1.DPath !%1.DPath! echo %1.PNX !%1.PNX! echo %1.NX !%1.NX! echo %1.DT !%1.DT! echo %1.DTSec !%1.DTSec! echo %1.Size !%1.Size! echo %1.Year,Month,Day !%1.Year!,!%1.Month!,!%1.Day! echo %1.HH,MM,SS !%1.HH!,!%1.MM!,!%1.SS! echo %1.ModifyedSecAgo !%1.ModifyedSecAgo! goto :eof ::=========================================================================== :LeapCount[] ::=========================================================================== :: %1=date, 1.1.1999 must be passed as 01.01.1999 :: return: !LeapCount!, Count of leap Days from 01.01.1980 to %1 set LeapCount.Debug==No if "%1"=="-debug" ( shift set LeapCount.Debug=Yes ) set LeapCount.Date=%1 set LeapCount.Year=%LeapCount.Date:~-4% set LeapCount.Month=%LeapCount.Date:~3,2% set LeapCount.Day=%LeapCount.Date:~0,2% set LeapCount=0 for /l %%i in (1980,1,!LeapCount.Year!) do ( set /a LeapCount.Mod4=%%i %% 4 set /a LeapCount.Mod100=%%i %% 100 set /a LeapCount.Mod400=%%i %% 400 set LeapCount.IsLeapYear=No if !LeapCount.Div400!==0 ( set LeapCount.IsLeapYear=Yes ) else ( if !LeapCount.Div4!==0 ( if not !LeapCount.Div100!==0 ( set LeapCount.IsLeapYear=Yes ) ) ) if !LeapCount.IsLeapYear!==Yes ( if !LeapCount.Year!==%%i ( if !LeapCount.Month! GEQ 03 ( set /a LeapCount+=1 ) ) else ( set /a LeapCount+=1 ) if "LeapCount.Debug"=="Yes" ( echo LeapCount: %%i !LeapCount! ) ) ) goto :eof |
||
------- Последний раз редактировалось CyberMuesli, 29-05-2012 в 12:43. Причина: исправил ошибку set LeapCount.Debug==Yes, лишний знак = Отправлено: 04:00, 29-05-2012 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - копирование файлов за текущую дату с сервера на сервер | 6a6yko | Скриптовые языки администрирования Windows | 10 | 21-06-2011 13:00 | |
VBS/WSH/JS - [решено] Как вписать дату и время в название файла? | navigator19 | Скриптовые языки администрирования Windows | 14 | 13-03-2011 10:30 | |
CMD/BAT - как получить дату и время, независимо от типа отображения даты ? | mitiya | Скриптовые языки администрирования Windows | 3 | 20-12-2010 11:14 | |
Как получить дату с цифровой камеры на DVD-диск.(Panas NV-GS) | ZevS | Видео и аудио: обработка и кодирование | 5 | 20-10-2009 16:23 | |
Как получить дату создания MPEG видеофайла? | andro_id | Видео и аудио: обработка и кодирование | 8 | 23-03-2009 11:45 |
|