Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Как получить текущую дату и время в интернете?

Ответить
Настройки темы
Любой язык - [решено] Как получить текущую дату и время в интернете?

Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Возникла проблема, не знаю как организовать/получить время из вне, из интернета VBS

Отправлено: 16:18, 01-03-2012

 

Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Если необходимо взять время именно из какого-либо онлайн-таймсервиса, то используй его API.

Отправлено: 21:05, 02-03-2012 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Foreigner, вполне бы сгодилось что-нибудь наподобие такого, только со временем. Можно, конечно, вычленять, например, из подобных: Current local time in Moscow City, Russia страниц, но хотелось бы попроще. Вам не попадалось?

white155, Вам нужно настроить привязку к ntp-серверу и синхронизировать время?

Отправлено: 23:13, 02-03-2012 | #3


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Iska, я не интересовался этим, за ненадобностью. timeapi.org -- первое что попадается по запросу "time api"
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:48, 03-03-2012 | #4


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Мне необходимо при запуске пакетного файла BAT или VBS узнать текущее время из интернета, чтобы в дальнейшем например сравнивать его с временем компьютера и производить другие действия.

Вся проблема в том что не знаю как работать с API или делать привязки к ntp-серверу и синхронизировать время, как мне предлагали сделать выше

Отправлено: 01:39, 04-03-2012 | #5


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить 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



Moderator


Сообщения: 53488
Благодарности: 15516

Профиль | Отправить 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:
сравнивать его с временем компьютера
Код: Выделить весь код
@Echo Off
Set Servers=ntp2.sth.netnod.se ntp2.sp.se Time2.Stupi.SE
Set Diff=
For /F "Tokens=3" %%I In ('cmdtime3.exe %Servers% ^| Find "Inaccuracy"') Do Set Diff=%%I
If Defined Diff (
  Echo Разница во времени: %Diff%
) Else (
  Echo Ошибка: не удалось определить разницу во времени.
)
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:03, 04-03-2012 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
…свой часовой пояс (сверху, переменная UTCZone). »

Код: Выделить весь код
wmic.exe TimeZone get Bias
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:35, 04-03-2012 | #8


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Anonymоus:
:: Если счетчик переходит границу суток, число дней возрастает на 1
:: Дни выводятся в переменную ED (и накапливаются) // да, знаю, что костыль и быдлокод »
Цитата Anonymоus:
:TMinus
:: Функция вычитания для сериализованного времени »
Не знаю, насколько это для Вас применимо, но похоже, что да. Вот фрагменты моего рабочего кода для определения актуальности бэкапов. Дата-время переводятся в секунды (с учетом високосных годов), секунды легко вычитаются друг из друга, даже если между вычитаемыми моментами времени полночь, новый год или сами моменты отстоят друг от друга на несколько лет.

В демке функцией :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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Как получить текущую дату и время в интернете?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход