Page 1 of 1

Schon wieder: Rechnen mit Datum

Posted: 04 Aug 2016, 15:28
by LuckyJoe
Hallo zusammen,

ich stehe etwas auf dem Schlauch mit dem Rechnen von Datumsteilen, obwohl ich Dank der Suche hier im Forum schon relativ weit bin.
Mein Script fordert eine Datumseingabe, die das script überprüft. So sollen als Datums-Trennzeichen "./-" zulässig sein.
Auch soll es egal sein, ob Tage oder Monate mit führender "0" eingegeben werden. Wird das Jahr zweistellig eingegeben, wird es auf 4 Stellen erweitert.
Wird das Jahr weggelassen, so wird das aktuelle Jahr angenommen. Das funktioniert auch alles (wahrscheinlich gibt es kürzere und/oder schönere Möglichkeiten).

Nun kommt aber das Problem:
Ich möchte das eingegebene Datum sowie die nächsten beiden Tage formatiert ausgeben. Das klappt nur "fast", nämlich nur, wenn sich die aufeinanderfolgenden Tage innerhalb des gleichen Monats befinden. Ist das Eingabedatum aber z.B. der Monatsletzte, dann funktioniert das nicht.
Wo ist mein Fehler?

Code: Select all

InputBox, EDatum, Eingabe, Datum eingeben (TT-MM[-JJ]):, , 140, 140
if ErrorLevel													; bei Esc/Cancel beenden
	Return
StringReplace, EDatum, EDatum, -, ., All							; alle "-" ersetzen durch "."
StringReplace, EDatum, EDatum, /, ., All							; alle "/" ersetzen durch "."
DatumArray := StrSplit(EDatum, ".")								; Datum bei "." splitten
Loop % DatumArray.MaxIndex()										; Datums-Teile holen
myDay   := SubStr("00" . DatumArray[1], -1)						; ggf. mit führender 0 auffüllen
myMonth := SubStr("00" . DatumArray[2], -1)						; ggf. mit führender 0 auffüllen
If % DatumArray.MaxIndex() = 2									; wenn nur 2 Teile (Tag + Monat)
	myYear := A_Now												; dann ist aktuelles Jahr gemeint
Else
	myYear := SubStr("20" . DatumArray[3], -3)					; "20" voransetzen, wenn zweistellig
FormatTime, MyYear, %myYear%, yyyy								; Jahr formatieren
EDatum = %MyYear%%MyMonth%%MyDay%								; Eingabe als Datum zusammensetzen
if EDatum is Date												; bei gültigem Datum
{
	FormatTime, TDatum1, %EDatum%, ddd., dd.MM.yyyy
	;Msgbox %EDatum%
	TDatum2 := EDatum += 1, D
	;Msgbox %EDatum%
	FormatTime, TDatum2, %TDatum2%, ddd., dd.MM.yyyy
	TDatum3 := EDatum += 1, D
	;Msgbox %EDatum%
	FormatTime, TDatum3, %TDatum3%, ddd., dd.MM.yyyy
	Msgbox %TDatum1%`r%TDatum2%`r%TDatum3%
}
Else
	MsgBox Bitte korrektes Datum eingeben.
Return
Danke schon mal im Voraus.
Lucky Joe

Re: Schon wieder: Rechnen mit Datum

Posted: 04 Aug 2016, 15:50
by wolf_II
Der Fehler liegt daran dass Du traditional syntax mit expression syntax verbindest. Dies hier += 1, D ist traditional, der opertor := ist expression.
Auf jeweils zwei Zeilen verteilt, pass alles.

Code: Select all

InputBox, EDatum, Eingabe, Datum eingeben (TT-MM[-JJ]):, , 140, 140
if ErrorLevel													; bei Esc/Cancel beenden
	Return
StringReplace, EDatum, EDatum, -, ., All							; alle "-" ersetzen durch "."
StringReplace, EDatum, EDatum, /, ., All							; alle "/" ersetzen durch "."
DatumArray := StrSplit(EDatum, ".")								; Datum bei "." splitten
Loop % DatumArray.MaxIndex()										; Datums-Teile holen
myDay   := SubStr("00" . DatumArray[1], -1)						; ggf. mit führender 0 auffüllen
myMonth := SubStr("00" . DatumArray[2], -1)						; ggf. mit führender 0 auffüllen
If % DatumArray.MaxIndex() = 2									; wenn nur 2 Teile (Tag + Monat)
	myYear := A_Now												; dann ist aktuelles Jahr gemeint
Else
	myYear := SubStr("20" . DatumArray[3], -3)					; "20" voransetzen, wenn zweistellig
FormatTime, MyYear, %myYear%, yyyy								; Jahr formatieren
EDatum = %MyYear%%MyMonth%%MyDay%								; Eingabe als Datum zusammensetzen
if EDatum is Date												; bei gültigem Datum
{
	FormatTime, TDatum1, %EDatum%, ddd., dd.MM.yyyy
	;Msgbox %EDatum%
	EDatum += 1, D
	TDatum2 := EDatum
	;Msgbox %EDatum%
	FormatTime, TDatum2, %TDatum2%, ddd., dd.MM.yyyy
	EDatum += 1, D
	TDatum3 := EDatum
	;Msgbox %EDatum%
	FormatTime, TDatum3, %TDatum3%, ddd., dd.MM.yyyy
	Msgbox %TDatum1%`r%TDatum2%`r%TDatum3%
}
Else
	MsgBox Bitte korrektes Datum eingeben.
Return

Re: Schon wieder: Rechnen mit Datum  Topic is solved

Posted: 05 Aug 2016, 01:10
by LuckyJoe
:headwall:
... jau! Danke, funktioniert perfekt!