Tag zu aktueller Zeit addieren - führende Null fehlt
Hallo Ihr Lieben,
Ich habe ein kleines Problem und braucht einen Tipp.
Mochte zum aktuellen Tag einen Tag dazugeben und diesen Wert in eine Variable schreiben.
Dazu habe ich folgenden Code erstellt:
Grundsätzlich funktioniert mein Batch, aber die führende Null wird beim Adieren aus dem Datum entfernt.
Natürlich weiß ich, wie ich da eine Null reinkriege, aber ich weiß leider nicht wie ich das nur dann mache, wenn der Tag unter 10 ist.
Hat jemand einen Tipp ?
Ich habe ein kleines Problem und braucht einen Tipp.
Mochte zum aktuellen Tag einen Tag dazugeben und diesen Wert in eine Variable schreiben.
Dazu habe ich folgenden Code erstellt:
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Tag=%%a.%%b
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Monat=%%b
set /a "Tag1=%date:~,2%+1"
set Morgen=%Tag1%.%Monat%
Grundsätzlich funktioniert mein Batch, aber die führende Null wird beim Adieren aus dem Datum entfernt.
Natürlich weiß ich, wie ich da eine Null reinkriege, aber ich weiß leider nicht wie ich das nur dann mache, wenn der Tag unter 10 ist.
Hat jemand einen Tipp ?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2659761978
Url: https://administrator.de/contentid/2659761978
Ausgedruckt am: 23.11.2024 um 04:11 Uhr
7 Kommentare
Neuester Kommentar
Grundsätzlich funktioniert mein Batch
Nicht mal ansatzweise. Zahlen mit führenden Nullen werden als oktale Zahlen interpretiert (08 und 09 sind ungültig). Und dann denke mal über Monatsende (incl. Schaltjahrregeln) und Jahresende nach.@echo off &setlocal
for /f "tokens=1-3 delims=." %%i in ("%date%") do call :DaysAdd %%k %%j %%i 1 y m d
echo %d%.%m%.%y%
pause
exit /b
:DaysAdd ByVal_YearIn ByVal_MonthIn ByVal_DayIn ByVal_DeltaIn ByRef_YearOut ByRef_MonthOut ByRef_DayOut
setlocal EnableExtensions
set /a "Year=%~1,Month=100%~2%%100,Day=100%~3%%100"
set /a "a=(14-Month)/12,b=Year+4800-a,c=(153*(Month+12*a-3)+2)/5+Day+b*365+b/4-b/100+b/400-1+%~4,d=(4*c+3)/146097,e=-d*146097/4+c,f=(4*e+3)/1461,g=(-1461*f)/4+e,h=(5*g+2)/153"
set /a "y=d*100+f-4800+h/10,m=(-h/10)*12+h+3,d=((153*h+2)/-5)+g+1"
set /a "Month=10%m%,Day=10%d%"
endlocal&set "%~5=%y%"&set "%~6=%Month:~-2%"&set "%~7=%Day:~-2%"&goto:eof
In Sprachen wie PowerShell braucht man sich nicht so zu verbiegen.
(Get-Date).AddDays(1).ToString("dd.MM.yyyy")
Steffen
Hatte nicht gedacht, dass es so komplex ist
Oh doch. Batch kennt keinen DateTime Typ (und keine Fließkommazahlen und keine Arrays und keine Strukturen und keine ...).bin deshalb noch mehr überwältigt von der Lösung.
Danke Aber das basiert natürlich auf uralten Algorithmen, die ich nicht neu erfunden, sondern nur angepasst habe.Prinzip: Gregorianischer Kalender -> Julianisches Datum -> Tage addieren/subtrahieren -> Gregorianischer Kalender
https://de.wikipedia.org/wiki/Umrechnung_zwischen_julianischem_Datum_und ...
Das mit der Powershell wurde mir hier schon ein paar Mal nahegelegt
Zu Recht.Nicht wirklich empfehlenswert, aber immerhin möglich, wäre die Berechnung von PowerShell ausführen zu lassen und das Ergebnis in einer Batch FOR /F Schleife einzufangen.
for /f %%i in (
'powershell.exe -nop -ep Bypass -c "(Get-Date).AddDays(1).ToString('dd.MM.yyyy')"'
) do echo %%i
Uuuuund um auch die ursprüngliche Frage noch zu beantworten, wie man ein- und zweistellige Zahlen immer zweistellig bekommt, hier mal ein paar Möglichkeiten. Have fun!
@echo off &setlocal
:: hier ändern und mit ein- und zweistelligen natürlichen Zahlen testen:
set /a "_n0=9"
:: Variante 1:
:: wenn <10, dann 0 voranstellen, sonst nicht
if %_n0% lss 10 (set "_n1=0%_n0%") else set "_n1=%_n0%"
:: Variante 2:
:: immer 0 voranstellen, dann die letzten beiden Ziffern verwenden
set "_n2=0%_n0%"
set "_n2=%_n2:~-2%"
:: Variante 3:
:: immer 10 voranstellen (ergibt einen integralen Wert, darum ist SET /A möglich), dann die letzten beiden Ziffern verwenden
set /a "_n3=10%_n0%"
set "_n3=%_n3:~-2%"
:: Variante 4:
:: Zehnerstelle (per Division) und Einerstelle (per Modulo) berechnen, dann verketten
set /a "tens=_n0/10,ones=_n0%%10"
set "_n4=%tens%%ones%"
:: alle _n... Variablen mit ihrem Wert ausgeben:
set _n
pause
Steffen