Как выполнить арифметику (сложение, вычитание) между двумя временными метками даты и времени? - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь создать произвольное время, используя пакетные файлы. Я пытаюсь вычесть заданные значения (например, 1 день, 1 месяц и 2000 лет) из моего кода, чтобы отобразить системное время, вычтенное из заданных значений, указанных ранее. Для часов и минут я вычитаю 10 часов и 10 минут (показаны в коде как разные значения). Я также знаю, что дата и время являются переменными, связанными с моей системой. ~ Пожалуйста, игнорируйте

Важно - Моя проблема сейчас с этой частью:

if %minb% EQU 60 set /a minb=%minb%-60 & set /a hourb=%hourb%+1
if %hourb% EQU 24 set /a hourb=%hourb%-24 & set /a dayb=%dayb%+1
if %dayb% EQU 30 set /a dayb=%dayb%-30 & set /a monthb=%monthb%+1
if %monthb% EQU 12 set /a monthb=%monthb%-12 & set /a yearb=%yearb%+1

Кажется, я не могу сбросить минуты до 0 и добавить часы в 1, когда значение минуты достигает 60 , и то же самое с часом, днем, месяцем, месяцем -летние отношения, кроме этого, проблемы с моим кодом в основном исправлены . Когда я запускаю код и жду, пока минуты (или прибавят к разнице во времени) достигнут 60, они просто пропускают 60 и не сбрасываются и не добавляют к значению clockb.

.

Мои форматы даты и времени:

  • Краткая дата: М / д / гггг
  • Длинная дата: дддд, мммм д, гггг
  • Короткое время: ч: мм
  • Долгое время: ч: мм: сс

Я использую Windows 10.

Обратите внимание, что значения в наборе / a не соответствуют моему описанию, но, конечно, их можно изменить. Они установлены на показанные номера только для целей тестирования.

EDIT:

Код:

@echo off
:start
set day=%date:~-7,2%
set month=%date:~-10,2%
set year=%date:~-4,4%
set hour=%time:~0,2%
set min=%time:~3,2%

set /a "hourb=%hour%-10"
set /a "minb=%min%+30"
set /a "dayb=%day%-1"
set /a "monthb=%month%-1"
set /a "yearb=%year%-2000"

if %minb% lss 10 set minb=0%minb%
if %hourb% lss 10 set hourb=0%hourb%
if %dayb% lss 10 set dayb=0%dayb%
if %monthb% lss 10 set monthb=0%monthb%

if %minb% EQU 60 set /a minb=%minb%-60 & set /a hourb=%hourb%+1
if %hourb% EQU 24 set /a hourb=%hourb%-24 & set /a dayb=%dayb%+1
if %dayb% EQU 30 set /a dayb=%dayb%-30 & set /a monthb=%monthb%+1
if %monthb% EQU 12 set /a monthb=%monthb%-12 & set /a yearb=%yearb%+1

cls
:: ———————————————————————–
@mode con cols=20 lines=6
title Arbitrary Clock

:time    
echo.     
echo.    %hourb%:%minb%
echo.    
echo.    %dayb%-%monthb%-%yearb%  
echo.      
ping -n 2 0.0.0.0 >nul
cls
goto :start

Хорошо, так как вы можете видеть в новом редактировании кода, я установил значения, указанные в начале этого вопроса. Вычитая 10 из часов, вычитая 1 из дней и месяцев, и вычитая 2000 из лет. Я добавил 30 минут, чтобы показать проблему прямо сейчас.

Так что мое системное время составляет 4: 40, 1/5 / 2019. Хорошо?

Отображаемое время на часах: 06: 70, 04-00-19.

Желаемый результат: 07: 10, 04-12-18.

Это было отредактировано. Заранее спасибо.

1 Ответ

0 голосов
/ 05 января 2019

У вас есть фундаментальная ошибка в вашем описании. Когда вы вычитаете количество дней / месяцев / лет из даты, вы вычитаете дату , , а не число! Например, если сегодняшняя дата - 05/01/2019 (очевидно, в формате ДД / ММ / ГГГГ), и вы хотите вычесть 1 месяц, результатом должно быть 05/12/2018, поскольку вы вычитаете дату (1 месяц). Если вы вычтете число 1 из части месяца , то результатом будет 05/00/2019. По этой причине эту проблему следует решать с помощью известных методов сложения и вычитания даты .

Проблема этих методов в том, что они действительны только для определенного диапазона дат, и эти диапазоны обычно начинаются в 1583 году. Если вы хотите вычесть 2000 год из 2018 года и получить 18, то такой «год 18» будет не действительный год в обычных методах управления датами. По этой причине, помимо использования обычных методов управления датами, вам также необходимо выполнить несколько небольших корректировок.

Я взял фрагменты кода, связанные в моем комментарии, и немного изменил их, чтобы решить эту проблему. Я выполнил несколько тестов, и, похоже, он работает правильно, но, возможно, метод может не работать в определенном диапазоне значений.

@echo off
setlocal EnableDelayedExpansion

rem Subtract a number of Days/Months/Years @ Hours:Minutes:Seconds from a datetime stamp
rem Antonio Perez Ayala aka Aacini

rem Define the "Date in DDMMYYYY format" To "Julian Day Number" conversion "function"
set "DateToJDN(Date)=( a=1Date, y=a%%10000, a/=10000, m=a%%100, d=a/100-100, a=(m-14)/12, (1461*(y+4800+a))/4+(367*(m-2-12*a))/12-(3*((y+4900+a)/100))/4+d-32075 )"

set /P "stamp1=Enter base timestamp as DD/MM/YYYY HH:MM:SS  "
set /P "stamp2=Enter timestamp to subtract in same format:  "

set "adjust=0"
for /F "tokens=1-4" %%a in ("%stamp1% %stamp2%") do set "date1=%%a" & set "time1=%%b" & set "date2=%%c" & set "time2=%%d"
if 1%date2:~-4% lss 11600 (
   set /A "adjust=1%date2:~-4%+1600"
   set "date2=%date2:~0,-4%!adjust:~1!"
   set "adjust=1600"
)
set /A "days=!DateToJDN(Date):Date=%date1:/=%! - !DateToJDN(Date):Date=%date2:/=%!, days1600=%DateToJDN(Date):Date=00001600%"
set /A "ss=(((1%time1::=-100)*60+1%-100) - (((1%time2::=-100)*60+1%-100)"
if %ss% lss 0 set /A "ss+=60*60*24, days-=1"
set /A "hh=ss/3600+100, ss%%=3600, mm=ss/60+100, ss=ss%%60+100"
if %days% lss %days1600% set /A days+=days1600, days1600=0
set /A "l=days+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,D=l-(2447*j)/80+100,l=j/11,M=j+2-(12*l)+100,Y=100*(n-49)+i+l+10000+adjust"
if %days1600% equ 0 set /A Y-=1600

echo                                            -----------------------
echo                                     Result:  %D:~1%/%M:~1%/%Y:~1% %hh:~1%:%mm:~1%:%ss:~1%

Небольшой пример:

Enter base timestamp as DD/MM/YYYY HH:MM:SS  05/01/2019 10:53:45
Enter timestamp to subtract in same format:  01/01/2000 10:10:00
                                           -----------------------
                                    Result:  04/12/0018 00:43:45

PS - я действительно хотел бы увидеть решение PowerShell для этой проблемы. Кажется, что это займет всего лишь короткую строку кода ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...