2012-06-26 13 views
6

मैं आज से 7 दिनों पहले विंडोज बैच फ़ाइल में दिनांक सेट करना चाहता हूं। मैं इसे निम्नलिखित प्रारूप में करना चाहता हूं।विंडोज कंसोल% DATE% मठ

set today=%date:~10,4%-%date:~4,2%-%date:~-7,2% 

कोई विचार कैसे 7 दिन के समय डेल्टा को कम करने के लिए?

+5

+1 बैच साथ कुछ भी करने की कोशिश कर के लिए। आपका एक मासोचिस्ट। – ZnArK

+2

क्या आप वास्तव में डॉस का उपयोग कर रहे हैं? या आप विंडोज में बैच फ़ाइल का उपयोग कर रहे हैं? – dbenham

+0

मैंने डॉस बैच जोड़ने की तारीखों को गुगल किया, और पहला लिंक मुझे यहां भेजा गया: http://www.robvanderwoude.com/datetimentmath.php - यह करने के लिए एक मजेदार बात नहीं है, लेकिन यह संभव है – SeanC

उत्तर

15

मैं कुछ समय पहले कुछ साइट में नीचे दिए गए विवरण पोस्ट:


निम्नलिखित बैच फ़ाइलों की तारीख से परिवर्तित जूलियन डे संख्या के लिए एक viceversa:

DATETOJULIAN.BAT:

@ECHO OFF 
REM CONVERT DATE TO JULIAN DAY NUMBER 
REM ANTONIO PEREZ AYALA 
REM GET MONTH, DAY, YEAR VALUES 
FOR /F "TOKENS=1-3 DELIMS=/" %%A IN ("%1") DO SET MM=%%A& SET DD=%%B& SET YY=%%C 
REM ELIMINATE LEFT ZEROS 
SET /A DD=10%DD% %% 100, MM=10%MM% %% 100 
REM CALCULATE JULIAN DAY NUMBER 
IF %MM% LSS 3 SET /A MM+=12, YY-=1 
SET /A A=YY/100, B=A/4, C=2-A+B, E=36525*(YY+4716)/100, F=306*(MM+1)/10, JDN=C+DD+E+F-1524 

जुलिएटोडेट.बीएटी:

REM CONVERT JULIAN DAY NUMBER TO MONTH, DAY, YEAR 
REM ANTONIO PEREZ AYALA 
SET /A W=(%1*100-186721625)/3652425, X=W/4, A=%1+1+W-X, B=A+1524, C=(B*100-12210)/36525, D=36525*C/100, E=(B-D)*10000/306001, F=306001*E/10000, DD=B-D-F, MM=E-1, YY=C-4716 
IF %MM% GTR 12 SET /A MM-=12, YY+=1 
REM INSERT LEFT ZEROS, IF NEEDED 
IF %DD% LSS 10 SET DD=0%DD% 
IF %MM% LSS 10 SET MM=0%MM% 
REM SHOW THE DATE 
ECHO %MM%/%DD%/%YY% 
,210

इस तरह, जोड़ने के लिए/निम्नलिखित लाइनों का प्रयोग कर एक तारीख को दिनों की संख्या घटाना:

CALL DATETOJULIAN %DATE% 
SET /A NEWDATE=JDN+DAYS 
CALL JULIANTODATE %NEWDATE% 

सादर ...

संदर्भ: http://quasar.as.utexas.edu/BillInfo/JulianDatesG.html


तुम बस जरूरत है अपने दिनांक प्रारूप को समायोजित करने के लिए यदि यह MM/DD/YYYY नहीं है।

0

एडमइस्ट्रैडा ने तारीखों को घटाने के बारे में पूछा। जूलियन कार्यों में सेटलोकल की वजह से मुझे दो जूलियन तिथियों को घटाकर कठिन समय था। मैंने इसे एक समारोह बुलाकर किया था।

कॉल: sub_Julians! जूलियन! % Today_Julian%

: sub_Julians

सेट/एक delta_dates =% ~ 1-% ~ 2

...

गोटो: EOF :: अंत: age_of_EPSdate

0

ठीक है, मुझे डीओडी ऑपरेशन सेंटर के लिए वर्तमान जेडीई प्रदर्शित करने के लिए बैच फ़ाइल की आवश्यकता थी। आप फ़ाइल को डबल-क्लिक कर सकते हैं और यह एक सीएमडी विंडो में प्रदर्शित होगा। फिर, बाहर निकलने के लिए कोई भी कुंजी दबाएं।

@echo off 
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value')  do set "dt=%%a" 
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set  "DD=%dt:~6,2%" 
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" 

:: Call the day ordinal number subroutine 
call :JDdayNumber %DD% %MM% %YYYY% DayOrdinalNumber 

:: Display the result 
echo. 
echo Today is JDay %DayOrdinalNumber% 
echo. 
pause, 
endlocal & goto :EOF 

:: set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" 
:: set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%" 
:: echo datestamp: "%datestamp%" 
:: echo timestamp: "%timestamp%" 
:: echo fullstamp: "%fullstamp%" 

:: ============================================================ 
:: Subroutine: Calculate a day's ordinal number within the year 
::JDdayNumber day month year return_ 
setlocal enableextensions enabledelayedexpansion 
if %2 LEQ 2 (
set /a f=%1-1+31*^(%2-1^) 
) else (
set /a a=%3 
set /a b=!a!/4-!a!/100+!a!/400 
set /a c=^(!a!-1^)/4-^(!a!-1^)/100+^(!a!-1^)/400 
set /a s=!b!-!c! 
set /a f=%1+^(153*^(%2-3^)+2^)/5+58+!s! 
) 
set /a return_=%f%+1 
endlocal & set "%4=%return_%" & goto :EOF 
0

मैं JDate और GDatehttp://www.robvanderwoude.com/datetimentmath.php से एक छोटा सा सबरूटीन्स के कोड पुनर्संशोधित:

यहाँ मैं के साथ आया है।

प्रयोग उदाहरण:

Enter ISO date: 
Enter number of days to add: 7 
2017-01-01 + 7 days = 2017-01-08 

Enter ISO date: 
Enter number of days to add: 
2017-01-08 + 7 days = 2017-01-15 

Enter ISO date: 
Enter number of days to add: 
2017-01-15 + 7 days = 2017-01-22 

Enter ISO date: 
Enter number of days to add: 
2017-01-22 + 7 days = 2017-01-29 

Enter ISO date: 
Enter number of days to add: 
2017-01-29 + 7 days = 2017-02-05 

Enter ISO date: 2017-02-12 
Enter number of days to add: -7 
2017-02-12 + -7 days = 2017-02-05 

कोड:

"दिनांक math.bat":

@echo off 

call :main %* 
goto :eof 

:main 
    setlocal 

    call :initialize "2017-01-01" "1" 

    endlocal 
    goto :eof 

:initialize 
    setlocal 
    set "previousDate=%~1" 
    set /a "numberOfDays=%~2" 

    set /p "previousDate=Enter ISO date: " 
    set /p "numberOfDays=Enter number of days to add: " 

    set "currentDate=" 
    call :addIsoDateDays "%previousDate%" "%numberOfDays%" currentDate 

    echo %previousDate% + %numberOfDays% days = %currentDate% 

    echo. 

    call :initialize "%currentDate%" "%numberOfDays%" 

    endlocal 
    goto :eof 

:stripLeadingZero 
    setlocal 
    set "number=%~1" 
    if %number:~0,1% equ 0 (
     set "number=%number:~1%" 
    ) 
    (
     endlocal 
     set "%~2=%number%" 
    ) 
    goto :eof 

:addLeadingZero 
    setlocal 
    set "number=%~1" 
    if %number% lss 10 (
     set "number=0%number%" 
    ) 
    (
     endlocal 
     set "%~2=%number%" 
    ) 
    goto :eof 

:gregorianToJulianDate 
    setlocal 
    set "gregorianYear=%~1" 
    set "gregorianMonth=%~2" 
    set "gregorianDay=%~3" 

    call :stripLeadingZero "%gregorianMonth%" gregorianMonth 
    call :stripLeadingZero "%gregorianDay%" gregorianDay 

    set /a "julianYear=(%gregorianYear% + 4800)" 
    set /a "julianMonth=((%gregorianMonth% - 14)/12)" 
    set /a "julianDate=((1461 * (%julianYear% + %julianMonth%)/4) + (367 * (%gregorianMonth% - 2 - (12 * %julianMonth%))/12) - ((3 * ((%julianYear% + %julianMonth% + 100)/100))/4) + (%gregorianDay% - 32075))" 

    (
     endlocal 
     set "%~4=%julianDate%" 
    ) 
    goto :eof 

:isoToJulianDate 
    setlocal 
    set "date=%~1" 
    set "year=" 
    set "month=" 
    set "day=" 

    for /f "tokens=1-3 delims=-" %%a in ("%date%") do (
     set "year=%%a" 
     set "month=%%b" 
     set "day=%%c" 
    ) 

    set /a "julianDate=0" 
    call :gregorianToJulianDate "%year%" "%month%" "%day%" julianDate 

    (
     endlocal 
     set "%~2=%julianDate%" 
    ) 
    goto :eof 

:julianToGregorianDate 
    setlocal 
    set /a "julianDate=%~1" 

    set /a "p=(%julianDate% + 68569)" 
    set /a "q=(4 * %p%/146097)" 
    set /a "r=(%p% - ((146097 * %q%) + 3)/4)" 
    set /a "s=(4000 * (%r% + 1)/1461001)" 
    set /a "t=(%r% - ((1461 * %s%)/4) + 31)" 
    set /a "u=(80 * %t%/2447)" 
    set /a "v=(%u%/11)" 

    set /a "gregorianYear=((100 * (%q% - 49)) + %s% + %v%)" 
    set /a "gregorianMonth=(%u% + 2 - (12 * %v%))" 
    set /a "gregorianDay=(%t% - (2447 * %u%/80))" 

    call :addLeadingZero "%gregorianMonth%" gregorianMonth 
    call :addLeadingZero "%gregorianDay%" gregorianDay 

    (
     endlocal 
     set "%~2=%gregorianYear%" 
     set "%~3=%gregorianMonth%" 
     set "%~4=%gregorianDay%" 
    ) 
    goto :eof 

:julianToIsoDate 
    setlocal 
    set /a "julianDate=%~1" 

    set "year=" 
    set "month=" 
    set "day=" 

    call :julianToGregorianDate "%julianDate%" year month day 

    set "isoDate=%year%-%month%-%day%" 

    (
     endlocal 
     set "%~2=%isoDate%" 
    ) 
    goto :eof 

:addIsoDateDays 
    setlocal 
    set "previousIsoDate=%~1" 
    set /a "numberOfDays=%~2" 

    set /a "previousJulianDate=0" 
    call :isoToJulianDate "%previousIsoDate%" previousJulianDate 

    set /a "currentJulianDate=(%previousJulianDate% + %numberOfDays%)" 

    set "currentIsoDate=" 
    call :julianToIsoDate "%currentJulianDate%" currentIsoDate 

    (
     endlocal 
     set "%~3=%currentIsoDate%" 
    ) 
    goto :eof