Показать полную графическую версию : Работа с датой, временем
alexey_vf
07-06-2011, 20:08
Ну совсем дурная задача, то чего cmd (bat) не поддерживает: нужно из конкретной даты-времени вычесть дату 06/01/1980 00.00.00.
1) Нужно получить количество дней, недель и количество секунд с последней недели от начальной даты до конечной даты, начальная дата жестко фиксирована= 06/01/1980 00.00.00. Где 00.00.00 (ЧЧ.ММ.СС)
Пример: 06/01/2011 00.00.00 - 06/01/1980 00.00.00
Решение: кол-во дней = 11315 (31 год / 365 дней), количество недель = 1616.428571428571 (11315 дней / 7 дней), количество секунд с последней недели = 259199.9 ( 0.428571428571*7 дней *24 часа * 3600 сек.)
Может есть простенькая консольная утилитка для работы с датой и временем?
Foreigner
07-06-2011, 20:48
Задача для PowerShell. Решается просто.
004 > $a = New-TimeSpan "06/01/2011 00:00:00" "06/01/1980 00:00:00"
005 > $a
Days : -11323
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 0
Ticks : -9783072000000000
TotalDays : -11323
TotalHours : -271752
TotalMinutes : -16305120
TotalSeconds : -978307200
TotalMilliseconds : -978307200000
@Echo Off
:: Даты в формате ddMMyyyy, время HHmmss
Set OldDate=06.01.1980
Set NewDate=06.01.2011
Set OldTime=08.08.08
Set NewTime=07.09.09
Call :JDat %NewDate%
Set days=%JDate%
Call :JDat %OldDate%
Set /a days-=JDate, seconds=(3600*1%NewTime:~0,2%+60*1%NewTime:~3,2%+1%NewTime:~6%)-(3600*1%OldTime:~0,2%+60*1%OldTime:~3,2%+1%OldTime:~6%)
If %seconds% LSS 0 Set /a days-=1
Set /a weeks=days/7, seconds=seconds+days*24*3600
Echo days %days%
Echo weeks %weeks%
Echo seconds %seconds%
Pause
:JDat
Set dat=%1
Set /a m=(1%dat:~3,2%-114)/12, JDate=1%dat:~0,2%+((1%dat:~3,2%-102-m*12)*367+((%dat:~6%+m)*487-49-(%dat:~6%+m)/100)*9)/12
GoTo:EOF
alexey_vf
08-06-2011, 19:09
Проверил.
Отличное решение, но где-то есть ошибка, очень простая (то на 1 день ровно, то на 6 дней ровно, секунды - последние цифры - точные). Скорее всего связано с округлением в cmd (bat) до большего. А нужно не округлять, а оставлять только целую часть недели (Weeks).
Контрольный пример: 22/05/2011 09:30:25
Точный результат должен быть: weeks=1637, SecondsFromWeek (секунды с начала новой недели №1637) = 34225
Где Set /a SecondsFromWeek=seconds - (weeks*7*24*3600)
Программа выдает: Weeks=1636
SecondsFromWeek = 552625
есть ошибка, очень простая (то на 1 день ровно, то на 6 дней ровно »
Неправильно считается число дней?
Уточните, как следует считать дни? Например, от 06.01.1980 23.59.59 до 07.01.1980 00.00.00 сколько считать дней прошло, 1 или 0 ? Скрипт считает 0, если разница во времени менее 24 часов, а как надо?
секунды с начала новой недели »
Не смог понять этой формулировки. Сейчас NewDate=08.06.2011 NewTime=19.22.44, от какой даты\времени нужно считать секунды?
Пример: 06/01/2011 00.00.00 - 06/01/1980 00.00.00
Решение: кол-во дней = 11315 »
Точное число дней = 11322, а не как у Вас указано.
alexey_vf
08-06-2011, 20:06
Неправильно считается число дней?
Уточните, как следует считать дни? Например, от 06.01.1980 23.59.59 до 07.01.1980 00.00.00 сколько считать дней прошло, 1 или 0 ? Скрипт считает 0, если разница во времени менее 24 часов, а как надо? »
Все считается от 06.01.1980 00.00.00 (начало дня 6 января нулевая секунда первого дня). Один полный день это 60 сек*60мин.*24часа = 86400 секунд (извиняюсь за известные вещи).
У вас полученный результат отличается на 86400 сек (1 день). Если не прошло 86400 сек с начала нового дня - то количество дней равно нулю (0).
Например, от 06.01.1980 23.59.59 до 07.01.1980 00.00.00 сколько считать дней прошло, 1 или 0 ?
Так считать не очень корректно для данной задачи. Считать нужно четко от известного нуля GPS времени: 06.01.1980 00ч.00м.00сек.
Поэтому с 06.01.1980 00.00.00 до 07.01.1980 00.00.00 прошел ровно 1 день.
Я думаю что с днями все ок.
Скорее всего проблема с неделями, я нечетко сформулировал что есть неделя (напр. если пошла неделя - 1638, то значение недели равно только целой части недели (напр. если неделя равна 1638.35465, то неделя берется равной 1638 ! А остаток недели это и есть секунды новой недели.
Извиняюсь за сложность задачи. В любом случае спасибо за помощь.
Вот проверка скрипта на PowerShell. Результат точный получается (Точный результат должен быть: weeks=1637, SecondsFromWeek (секунды с начала новой недели №1637) = 34225):
$a = New-TimeSpan "05/22/2011 09:30:25" "06/01/1980 00:00:00"
$a
P.S. Скрипт очень нужен.
@Echo Off
:: Даты в формате ddMMyyyy, время HHmmss
Set OldDate=06.01.1980
Set NewDate=22.05.2011
Set OldTime=00.00.00
Set NewTime=09.30.25
Call :JDat %NewDate%
Set days=%JDate%
Call :JDat %OldDate%
Set /a days-=JDate, weeks=days/7, lessweeks=days%%7, seconds=3600*(lessweeks*24+1%NewTime:~0,2%-1%OldTime:~0,2%) + 60*(1%NewTime:~3,2%-1%OldTime:~3,2%) + 1%NewTime:~6%-1%OldTime:~6%
Echo days %days%
Echo weeks %weeks%
Echo lessweeks %lessweeks%
Echo seconds %seconds%
Pause
:JDat
Set dat=%1
Set /a m=(1%dat:~3,2%-114)/12, JDate =1%dat:~0,2%+367*(1%dat:~3,2%-102-m*12)/12-3*((%dat:~6%+4900+m)/100)/4+1461*(%dat:~6%+4800+m)/4
GoTo:EOF
alexey_vf
13-06-2011, 10:20
1) Даты в том формате ddMMyyyy.
2) Правильная начальная дата: 06.01.1980 - (6 января)
Решение неверное получается...
по данному примеру: Контрольный пример: 06/01/1980 00.00.00 to 22/05/2011 09.30.25
days 11458
weeks 1636
lessweeks 6
seconds 552625
Для продолжения нажмите любую клавишу . . .
Правильное решение...
(Точный результат должен быть: weeks=1637, SecondsFromWeek (секунды с начала новой недели №1637) = 34225)
Возможно проще считать секунды от начального времени до конечного? А потом делить на дни и недели? Напр. время (секунд кол-во) по данному примеру = 990091840.
Ошибка ровно на один день (24 часа), возможно это как то связано с тем что GPS дни читаются так: 0,1,2,3,4,5,6 - все это 7 дней недели.
Если вы прибавите ровно один день (86400 сек) все получится точно секунда в секунду, при этом неделя станет уже 1637.
В любом случае спасибо за помощь. Просто в коде что-то где-то округляется не так.
awkozlov
05-06-2013, 04:52
Надо бы сделать вставочку, т.к. время, иной раз, возвращается в 7 знаков (ведущий ноль заменяется пробелом)
"_2:47:56" => "02:47:56"
В результате ошибка "Непарные скобки" на строке
Set /a seconds=3600*(lessweeks*24+1%NewTime:~0,2%-1%OldTime:~0,2%) + 60*(1%NewTime:~3,2%-1%OldTime:~3,2%) + 1%NewTime:~6%-1%OldTime:~6%
У себя сделал так (хотя можно было и попроще... но уж сделал)
:CheckCmdStart
for /f "usebackq delims=" %%i in (`find /n /v "" %zFolder%\%si%\cmdstart.txt ^| find "[1]"`) do (set value=%%i)
set OldDate=%value:~3%
for /f "usebackq delims=" %%i in (`find /n /v "" %zFolder%\%si%\cmdstart.txt ^| find "[2]"`) do (set value=%%i)
set OldTime=%value:~3%
set NewDate=%date:~-11,2%.%date:~-7,2%.%date:~-4,4%
set NewTime=%time:~-11,2%:%time:~-8,2%:%time:~-5,2%
::Set OldDate=05.06.2013
::Set NewDate=05.06.2013
::Set OldTime= 2.17.54
::Set NewTime= 4.02.57
set /a var1=0
:: 0 + последние 7 символов 2.17.54 => 02.17.54
call :len var1 %OldTime%
if %var1% == 7 (
Set OldTime=0%OldTime:~-7%
)
::Echo var1=%var1%
set /a var1=0
call :len var1 %NewTime%
if %var1% == 7 (
Set NewTime=0%NewTime:~-7%
)
Echo OldDate=%OldDate%
Echo OldTime=%OldTime%
Echo NewDate=%NewDate%
Echo NewTime=%NewTime%
Call :JDat %NewDate%
Set days=%JDate%
Call :JDat %OldDate%
::Set /a days-=JDate, weeks=days/7, lessweeks=days%%7, seconds=3600*(lessweeks*24+1%NewTime:~0,2%-1%OldTime:~0,2%) + 60*(1%NewTime:~3,2%-1%OldTime:~3,2%) + 1%NewTime:~6%-1%OldTime:~6%
Set /a days-=JDate
Set /a weeks=days/7
Set /a lessweeks=days%%7
Set /a seconds=3600*(lessweeks*24+1%NewTime:~0,2%-1%OldTime:~0,2%) + 60*(1%NewTime:~3,2%-1%OldTime:~3,2%) + 1%NewTime:~6%-1%OldTime:~6%
Echo days %days%
Echo weeks %weeks%
Echo lessweeks %lessweeks%
Echo seconds %seconds%
pause
goto :EOF
:len
set len=%~2
if not "%len%"=="" set /a %1+=1 & call :len %1 "%len:~1%"
goto :eof
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.