|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Работа с датой, временем |
|
CMD/BAT - Работа с датой, временем
|
Новый участник Сообщения: 12 |
Профиль | Отправить PM | Цитировать Ну совсем дурная задача, то чего 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 сек.) Может есть простенькая консольная утилитка для работы с датой и временем? |
|
Отправлено: 20:08, 07-06-2011 |
Ветеран Сообщения: 1754
|
Задача для PowerShell. Решается просто.
Цитата:
|
|
Отправлено: 20:48, 07-06-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать @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 |
Последний раз редактировалось gora, 07-06-2011 в 21:41. Причина: исправил Отправлено: 20:49, 07-06-2011 | #3 |
Новый участник Сообщения: 12
|
Профиль | Отправить PM | Цитировать Проверил.
Отличное решение, но где-то есть ошибка, очень простая (то на 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 |
Отправлено: 19:09, 08-06-2011 | #4 |
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать Цитата alexey_vf:
Уточните, как следует считать дни? Например, от 06.01.1980 23.59.59 до 07.01.1980 00.00.00 сколько считать дней прошло, 1 или 0 ? Скрипт считает 0, если разница во времени менее 24 часов, а как надо? Цитата alexey_vf:
Цитата alexey_vf:
|
||||
Последний раз редактировалось gora, 08-06-2011 в 19:48. Отправлено: 19:25, 08-06-2011 | #5 |
Новый участник Сообщения: 12
|
Профиль | Отправить PM | Цитировать Цитата gora:
У вас полученный результат отличается на 86400 сек (1 день). Если не прошло 86400 сек с начала нового дня - то количество дней равно нулю (0). Цитата:
Поэтому с 06.01.1980 00.00.00 до 07.01.1980 00.00.00 прошел ровно 1 день. Я думаю что с днями все ок. Скорее всего проблема с неделями, я нечетко сформулировал что есть неделя (напр. если пошла неделя - 1638, то значение недели равно только целой части недели (напр. если неделя равна 1638.35465, то неделя берется равной 1638 ! А остаток недели это и есть секунды новой недели. Извиняюсь за сложность задачи. В любом случае спасибо за помощь. Вот проверка скрипта на PowerShell. Результат точный получается (Точный результат должен быть: weeks=1637, SecondsFromWeek (секунды с начала новой недели №1637) = 34225): P.S. Скрипт очень нужен. |
||
Последний раз редактировалось alexey_vf, 08-06-2011 в 20:23. Отправлено: 20:06, 08-06-2011 | #6 |
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать @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 |
Последний раз редактировалось gora, 13-06-2011 в 12:42. Отправлено: 20:52, 08-06-2011 | #7 |
Новый участник Сообщения: 12
|
Профиль | Отправить PM | Цитировать 1) Даты в том формате ddMMyyyy.
2) Правильная начальная дата: 06.01.1980 - (6 января) Решение неверное получается... по данному примеру: Контрольный пример: 06/01/1980 00.00.00 to 22/05/2011 09.30.25 Правильное решение... Цитата:
Ошибка ровно на один день (24 часа), возможно это как то связано с тем что GPS дни читаются так: 0,1,2,3,4,5,6 - все это 7 дней недели. Если вы прибавите ровно один день (86400 сек) все получится точно секунда в секунду, при этом неделя станет уже 1637. В любом случае спасибо за помощь. Просто в коде что-то где-то округляется не так. |
|
Последний раз редактировалось alexey_vf, 13-06-2011 в 10:44. Отправлено: 10:20, 13-06-2011 | #8 |
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать alexey_vf, поправил.
|
Отправлено: 12:43, 13-06-2011 | #9 |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать Надо бы сделать вставочку, т.к. время, иной раз, возвращается в 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 |
Последний раз редактировалось awkozlov, 06-06-2013 в 05:17. Отправлено: 04:52, 05-06-2013 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Ошибка - Глюки с ситемной датой | barbedoo | Microsoft Windows 2000/XP | 43 | 01-07-2008 18:41 | |
Проблема со временем | PLATON | Непонятные проблемы с Железом | 2 | 20-04-2008 15:35 | |
C/C++ - Работа с датой и время | hhh8486 | Программирование и базы данных | 3 | 02-11-2007 18:48 | |
проблема с датой | Alex andr | Microsoft Windows 2000/XP | 4 | 12-12-2005 07:03 | |
проблемы с датой | drosd | Хочу все знать | 1 | 30-04-2004 07:54 |
|