Datum von Montag ermitteln

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

siod
Posts: 17
Joined: 21 Jun 2016, 10:02

Datum von Montag ermitteln

21 Jun 2016, 10:07

Hallo zusammen,

ich möchte gerne immer das Datum des Montags der laufenden Woche haben im Format dd.mm.yyyy

Ich habe bereits folgendes Script gefunden und ein wenig angepasst, allerdings wird ab Sonntag der folgende Montag, nicht der letzte Montag ausgegeben. Könnt ihr mir helfen?

Code: Select all

^d::

dayToSearch := 2                     ; 1=Sunday, 2=Monday,...
Formattime, dayOfToday,, WDay        ; Get number of todays day
diff := dayToSearch - dayOfToday     ; get difference
;Ifless, diff, 0, EnvAdd diff, 7      ; if in the "past" add 1 week
toDay := A_Now                       ; we need today as var cause it will be overwritten in next line
EnvAdd toDay, %diff%,days
FormatTime toDay_Readable, %toDay%, LongDate
Msgbox Letzter Montag war %toDay_Readable%
User avatar
TheDewd
Posts: 1391
Joined: 19 Dec 2013, 11:16
Location: USA

Re: Datum von Montag ermitteln

21 Jun 2016, 13:45

Code: Select all

^d::
    FormatTime, Today, % A_Now, WDay
    Monday += -Today+2, Days
    FormatTime, Monday, % Monday, dd.MM.yyyy
    MsgBox, % Monday
return
Image Bulldozer - Sokoban inspired game from 1994 recreated in AutoHotkey.
siod
Posts: 17
Joined: 21 Jun 2016, 10:02

Re: Datum von Montag ermitteln

21 Jun 2016, 23:43

Hallo,

leider besteht hier das gleiche Problem: am 26.06.2016 wir der 27.06.2016 ausgegebn, es sollte aber noch der 20.06.2016 sein...

edit: außerdem wird das korrekte Datum bei den anderen Tagen nur bei der ersten Ausführung angezeigt, bei den folgenden Versuchen wird das aktuelle Tagesdatum ausgegeben :(
Last edited by siod on 22 Jun 2016, 00:57, edited 1 time in total.
User avatar
LuckyJoe
Posts: 265
Joined: 02 Oct 2013, 09:52

Re: Datum von Montag ermitteln

22 Jun 2016, 00:55

Hallo siod,

also bei mir wird auch für den 26.06.2016 der Montag, 20.06.2016 ausgegeben. Liegt es vielleicht am Gebitesschema (L407 für Deutschland)?

FormatTime, Today, '26.06.16' L0407, WDay
Monday += -Today+2, Days
FormatTime, Monday, % Monday, dd.MM.yyyy
MsgBox, % Monday
Herzliche Grüße aus dem Rheinland
Lucky Joe
siod
Posts: 17
Joined: 21 Jun 2016, 10:02

Re: Datum von Montag ermitteln

22 Jun 2016, 01:00

mmh, geht bei mir auch mit dem code nicht, gleiches Problem.
Johnny R
Posts: 280
Joined: 03 Oct 2013, 02:07

Re: Datum von Montag ermitteln

22 Jun 2016, 01:38

Vielleicht kommt Ihr mit dem Thread Datum und Zeit in AHK von just me weiter. Dort findet sich auch eine Vielzahl weiterer Links auf Datums- und Zeitfunktionen, die hoppfrosch zusammengestellt hat...
just me
Posts: 7112
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum von Montag ermitteln

22 Jun 2016, 01:39

Moin,

der Sonntag braucht eine Sonderbehandlung, hier mal als Funktion:

Code: Select all

AktuellerMontag() {
   RechenDatum := A_Now
   FormatTime, AktuellerWochentag, %RechenDatum%, WDay
   If (AktuellerWochentag = 1) ; Sonntag
      Differenz := -6
   Else
      Differenz := -AktuellerWochentag + 2 ; Montag = 2
   RechenDatum += Differenz, Days
   FormatTime, Montag, %RechenDatum%, dd.MM.yyyy
   Return Montag
}
MsgBox, % AktuellerMontag()
Der 'TagDerWoche' (WDay) wird von AHK unabhängig vom Gebietsschema immer mit Sonntag = 1, Montag = 2, ... zurückgeliefert
siod
Posts: 17
Joined: 21 Jun 2016, 10:02

Re: Datum von Montag ermitteln

22 Jun 2016, 01:50

Hallo @just me ,

auf der Fährte war ich auch gerade, hätte aber noch einige Zeit gebraucht bis ich es so gehabt hätte. Mein Code sieht jetzt wie folgt aus, leider wird Montag in der MessageBox nicht ausgegeben:

Code: Select all

^d::
    FormatTime, Today, % A_Now, WDay
    Monday += -Today+2, Days

AktuellerMontag() {
   RechenDatum := A_Now
   FormatTime, AktuellerWochentag, %RechenDatum%, WDay
   If (AktuellerWochentag = 1) ; Sonntag
	{
      Differenz := -6
   }Else{
      Differenz := -AktuellerWochentag + 2 ; Montag = 2
   }
   RechenDatum += Differenz, Days
   FormatTime, Montag, %RechenDatum%, dd.MM.yyyy
   Return Montag
}	
AktuellerMontag()
    FormatTime, Monday, % Monday, dd.MM.yyyy
    MsgBox, % Monday " , " Monday " , " Montag
return
edit: Ok, habs hinbekommen:

Code: Select all

^d::
    FormatTime, Today, % A_Now, WDay
    Monday += -Today+2, Days

AktuellerMontag() {
   RechenDatum := A_Now
   FormatTime, AktuellerWochentag, %RechenDatum%, WDay
   If (AktuellerWochentag = 1) ; Sonntag
	{
      Differenz := -6
   }Else{
      Differenz := -AktuellerWochentag + 2 ; Montag = 2
   }
   RechenDatum += Differenz, Days
   FormatTime, Montag, %RechenDatum%, dd.MM.yyyy
    Return Montag
}	

    FormatTime, Monday, % Monday, dd.MM.yyyy
    MsgBox, % Monday " , " Monday " , " AktuellerMontag()
return
bleibt noch das Problem, das bei erneuter Ausführung % Monday und Monday das Tagesaktuelle Datum ausgeben. Kann mir das auch noch jemand erklären? Vielen Dank aber schon mal bis hier her!!
just me
Posts: 7112
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum von Montag ermitteln

22 Jun 2016, 02:12

Die Funktionsdefinition gehört nicht in die Hotkey- oder eine sonstige Subroutine. Du kannst sie an beliebiger Stelle 'vereinzelt' im Skript ablegen.

Innerhalb der Hotkeyroutine kannst Du auf die Rechnerei total verzichten:

Code: Select all

^d::
   MsgBox, % AktuellerMontag()
return

AktuellerMontag() {
   RechenDatum := A_Now
   FormatTime, AktuellerWochentag, %RechenDatum%, WDay
   If (AktuellerWochentag = 1) ; Sonntag
   {
      Differenz := -6
   }Else{
      Differenz := -AktuellerWochentag + 2 ; Montag = 2
   }
   RechenDatum += Differenz, Days
   FormatTime, Montag, %RechenDatum%, dd.MM.yyyy
   Return Montag
}
Wenn Dir das lieber ist, kannst Du den Funktionscode auch direkt in die Hotkeyroutine legen:

Code: Select all

^d::
   RechenDatum := A_Now
   FormatTime, AktuellerWochentag, %RechenDatum%, WDay
   If (AktuellerWochentag = 1) ; Sonntag
   {
      Differenz := -6
   }Else{
      Differenz := -AktuellerWochentag + 2 ; Montag = 2
   }
   RechenDatum += Differenz, Days
   FormatTime, Montag, %RechenDatum%, dd.MM.yyyy
   MsgBox, %Montag%
return
just me
Posts: 7112
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum von Montag ermitteln

22 Jun 2016, 03:57

... bleibt noch das Problem, das bei erneuter Ausführung % Monday und Monday das Tagesaktuelle Datum ausgeben. Kann mir das auch noch jemand erklären?
Auch beim Rechnen mit Datum-Zeit-Werten hat AHK eine 'Besonderheit', die den Programmierer dazu verführen kann, auf die Initialisierung von beteiligten Variablen zu verzichten. In

Code: Select all

Monday += -Today+2, Days
wird, falls die Variable Monday noch keinen Wert hat bzw. leer ist, der aktuelle Datum-Zeit-Wert entsprechend A_Now verwendet.

Beim ersten Aufruf der Hotkeyroutine ist Monday tatsächlich leer, und deshalb funktioniert die Berechnung wie gewünscht. Durch die Berechnung wird Monday aber zunächst einmal der Datum-Zeit-Wert des gesuchten Montags zugewiesen. Danach wird Monday noch per

Code: Select all

FormatTime, Monday, % Monday, dd.MM.yyyy
mit dem gewünschten Datumsformat überschrieben und bleibt so stehen.

Beim zweiten Aufruf enthält Monday dann immer noch das Datumsformat. Das ist kein gültiger Datum-Zeit-Wert, und deshalb wird Monday bei

Code: Select all

Monday += -Today+2, Days
geleert. Weil Monday jetzt leer ist, schlägt in

Code: Select all

FormatTime, Monday, % Monday, dd.MM.yyyy
wieder die o.a. 'Besonderheit' zu und der aktuelle Datum-Zeit-Wert wird verwendet. So liefert Anweisung das Datumsformat für den aktuellen Tag.

In Deinem ursprünglich eingestellten Skript wird das durch

Code: Select all

toDay := A_Now                       ; we need today as var cause it will be overwritten in next line
verhindert.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 53 guests