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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Работа с датой, временем

Ответить
Настройки темы
CMD/BAT - Работа с датой, временем

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


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

Профиль | Отправить 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
Благодарности: 965

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


Задача для 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

Отправлено: 20:48, 07-06-2011 | #2



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

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


Аватара для gora

Ушёл из жизни


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

Профиль | Отправить 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
Благодарности: 0

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


Аватара для gora

Ушёл из жизни


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

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


Цитата alexey_vf:
есть ошибка, очень простая (то на 1 день ровно, то на 6 дней ровно »
Неправильно считается число дней?
Уточните, как следует считать дни? Например, от 06.01.1980 23.59.59 до 07.01.1980 00.00.00 сколько считать дней прошло, 1 или 0 ? Скрипт считает 0, если разница во времени менее 24 часов, а как надо?
Цитата alexey_vf:
секунды с начала новой недели »
Не смог понять этой формулировки. Сейчас NewDate=08.06.2011 NewTime=19.22.44, от какой даты\времени нужно считать секунды?
Цитата alexey_vf:
Пример: 06/01/2011 00.00.00 - 06/01/1980 00.00.00
Решение: кол-во дней = 11315 »
Точное число дней = 11322, а не как у Вас указано.

Последний раз редактировалось gora, 08-06-2011 в 19:48.


Отправлено: 19:25, 08-06-2011 | #5


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


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

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


Цитата gora:
Неправильно считается число дней?
Уточните, как следует считать дни? Например, от 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. Скрипт очень нужен.

Последний раз редактировалось alexey_vf, 08-06-2011 в 20:23.


Отправлено: 20:06, 08-06-2011 | #6


Аватара для gora

Ушёл из жизни


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

Профиль | Отправить 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
Благодарности: 0

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


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.
В любом случае спасибо за помощь. Просто в коде что-то где-то округляется не так.

Последний раз редактировалось alexey_vf, 13-06-2011 в 10:44.


Отправлено: 10:20, 13-06-2011 | #8


Аватара для gora

Ушёл из жизни


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

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


alexey_vf, поправил.

Отправлено: 12:43, 13-06-2011 | #9


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


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

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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Работа с датой, временем

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

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




 
Переход