Показать полную графическую версию : [решено] Прибавить время
Помогите пожалуста с решением проблемы, я уже мозг сломал, пока пытался скрипт написать. В общем, у меня есть файл со строчками, каждая из них начинается со времени, а дальше разная информация идет. Как получать время из строчки - я понял. Мне нужно прибавить ко времени в строчке 15 секунд, и не получается, хоть ты тресни. Если секунд меньше 39 - все нормально, а если больше - это получается надо прибавлять минуты, а если и минуты за 59 переваливают, то и часы. Начал писать условие if, но бросил, не осилил. Может кто поможет? Вот образец строчки, если что
13:01:26 Could not establish connection to Steam servers (steamclient2).
Anonymоus
02-12-2011, 18:05
Например вот это, примеры использования показаны, так что думаю, разберётесь. Время разбирается на HH MM SS через For, для использования в дальнейшем, вот так:
For /F "tokens=1,2,3 delims=:" %%A In ("13:01:26") Do (
Set HH=%%A
Set MM=%%B
Set SS=%%C
)
А это сами функции для работы со временем
@Echo Off
:: Устанавливаем время
Set HH=23
Set MM=15
Set SS=00
:: Демонстрация работы
:: ===================================
Echo Time = [%HH%:%MM%:%SS%]
Call :SerializeTime
Set TmpTime=%ErrorLevel%
Echo Serialized time = %TmpTime%
Call :DeserializeTime %TmpTime%
Echo Deserialized time = [%DHH%:%DMM%:%DSS%]
Call :TMinus %TmpTime% 9014
Call :DeserializeTime %ErrorLevel%
Echo Time - 2:30:14 = [%DHH%:%DMM%:%DSS%]
Call :TPlus %TmpTime% 9014
Call :DeserializeTime %ErrorLevel%
Echo Time + 2:30:14 = [%DHH%:%DMM%:%DSS%]
Pause&Exit
:: ===================================
::===Функции работы со временем в .bat====================================
:: Anonymous, 2010
:: v 1.3
: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
Call :Cut %HH% HH&Call :Cut %MM% MM&Call :Cut %SS% SS
Set /A STime=(HH*60*60)+(MM*60)+SS
Exit /B %STime%
:DeserializeTime
:: Десериализует время, приводит его к стандартному формату
:: Формат: Call :DeserializeTime (сериализованное время)
:: Вывод - в переменные DHH DMM и DSS
Set DHH=00&Set DMM=00&Set DSS=00
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 Result=
Set /A Result=%1-%2
If %2 GTR %1 (
Set /A Result=86400+%1-%2
)
Exit /B %Result%
:TPlus
:: Функция прибавления для сериализованного времени
:: Формат: Call :TPlus (сериализованное время) (сколько секунд прибавить)
:: Вывод - в ErrorLevel
Set Result=
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=%STime%
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 %STime% %1
If %2 GTR %Result% Set Timer2=1&Exit /B 1
Set Timer2=0&Exit /B 0
:Cut
:: Убирание ведущих нулей и пробелов
:: Формат: Call :Cut (Двухзначное число) (Переменная, куда вывести резуьтат)
Set d=%1
If "%d:~,1%"=="0" Set %2=%d:~1%
If "%d:~,1%"==" " Set %2=%d:~1%
Exit /B
::========================================================================
А если не секрет, в чем сакральный смысл прибавления 15 секунд к времени из логов (судя по "Steam" - игры)?
А если не секрет, в чем сакральный смысл прибавления 15 секунд к времени из логов (судя по "Steam" - игры)? »
Тсс! Мальчиш-Кибальчиш такие тайны не выдаёт :).
ARMAGIDON
01-09-2020, 13:48
так что думаю, разберётесь. »
Привет, а можно в этот код добавить текущее время и вывод остатка в секундах ?
например сейчас
10:30
мы установили время
9:30
батник прибавил три часа это
12:30
вот нужно узнать время в секундах между текущем, а именно 10:30 и будущем 12:30
Я что то пробовал вывести, но больше запутался :flag:
Цель-то какая? А то:
1. Тема 2011 года (некропостерство в решенных темах это такое себе)
2. Если известно время которое было добавлено не проще ли сразу вломить timeout на это же количество секунд?
например timeout 15
3. Решать проблемы со временем на cmd когда есть куда как более удобный powershell опять же так себе вариант.
4. Даже если уперлись в cmd, то есть способы получения текущего времени гораздо более надежные чем потрошение %date% (несколько раз меня это дело здорово подводило из-за разных региональных настроек, посему пользую другой вариант)
@echo off
for /f "tokens=1* delims==" %%a in ('"wmic path win32_localtime get Day,Month,Year,Hour,Minute,Second /value|find "^=""') do set "%%a=0%%b"
set Year=%Year:~-5%
set Month=%Month:~-3%
set Day=%Day:~-3%
set Hour=%Hour:~-3%
set Minute=%Minute:~-3%
set Second=%Second:~-3%
echo %Year%.%Month%.%Day% - %Hour%:%Minute%:%Second%
ARMAGIDON
01-09-2020, 19:39
Цель-то какая? »
так для этого и нужно, если от установленного времени не про шло к примеру два часа то что бы мой батник ставил timeout этих секунд , дальше как пройдут он запустит что надо.
он берет установленное время с лог файла с помощью этого кода что выше проверяет если прошло к примеру три часа, если да то запуск, если нет..., вот тут то мне и нужны эти секунды что бы он установил отсчёт до нужного мне времени.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.