Datum und Zeit in AHK

Hilfreiche Erklärungen und Tipps zum Lernen von Autohotkey

Moderator: jNizM

just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Datum und Zeit in AHK

Post by just me » 20 Nov 2015, 06:07

AHK nutzt für Datum und Zeit ein Zeitstempelformat, das in der Hilfe etwas versteckt unter FileSetTime->Bemerkungen beschrieben wird. Auf den aktuellen Zeitstempel bzw. Teile davon kann man über verschiedene integrierte Variablen zugreifen. Für die Ausgabe eines Zeitstempels in einem selbstbestimmten Format gibt es die Anweisung FormatTime. Für die Prüfung, ob eine Variable einen gültigen Zeitstempel enthält, gibt es die Anweisung If Var Is Time. Soweit, sogut.

Manchmal muss man aber mit Datumzeitangaben auch rechnen, um z.B. das Datum des Tages harauszufinden der 6 Wochen nach einem vorgegebenen Datum liegt. Dafür gibt es zwei Dinosaurier, die Anweisungen

Code: Select all

EnvAdd, Var, Wert, Zeiteinheit
EnvSub, Var, Wert, Zeiteinheit
bzw. die 'moderneren' Formen

Code: Select all

Var += Wert, Zeiteinheit
Var -= Wert, Zeiteinheit
Aus mir nicht bekannten Gründen verstecken sich auch diese Anweisungen in den Tiefen der Hilfe und sind im Inhaltsverzeichnis nicht direkt verlinkt. Vielleicht auch deshalb stellt sich für viele Neueinsteiger immmer wieder die Frage, wie man denn in AHK mit Daten/Zeiten rechnen kann.

Obwohl die 'modernen' Formen mit dem += Operator einem Ausdruck recht ähnlich sehen, sind sie wie Kommandos zu behandeln, d.h. sie können z.B. nicht in per Komma verketteten Ausdrücken verwendet werden. Außerdem darf der erste Parameter Wert kein Ausdruck sein. Im der Folge werden auschließlich diese Formen verwendet.

Bei beiden Anweisungen muss man immer daran denken, dass das Egebnis in der Variablen Var abgelegt wird, diese also verändert. Wenn man den ursprünglichen Wert später noch braucht, sollte man also immer eine eigene Variable für die Rechnerei benutzen.

Zeitstempel:

AHK behandelt die Zeitstempel in den dafür vorgesehehen Anweisungen sehr großzügig. So wird eine leere Variable bzw. ein leerer Wert immer mit dem aktuellen Zeitstempel gefüllt. Verkürzte Zeitstempel werden für die Bearbeitung aufgefüllt. So werden aus:
  • 2014 -> 20140101000000
  • 201405 -> 20140501000000
  • 20141112 -> 20141112000000
Für fehlende Tage und Monate wird immer mit 01, für fehlende Stunden, Minuten und Sekunden immer mit 00 aufgefüllt. Anweisungen, die einen Zeitstempel zurückgeben, liefern ihn deshalb immer mit voller Länge von 14 Stellen, auch wenn die Eingabe z.B. nur aus einem 4-stelligen Wert für das Jahr bestand.

Addieren und Subtrahieren von Zeiteinheiten:

Für das Addieren und Subtrahieren von Zeiteinheiten zu/von einem gegebenen Zeitstempel ist Var += Wert, Zeiteinheit da.

Die Variable Var muss dabei einen gültigen Zeitstempel bzw. den Anfang eines gültigen Zeitstempels enthalten. Sie darf auch gänzlich sehr sein, dann wird der vollständige aktuelle Zeitstempel verwendet.

Der Parameter Wert bestimmt die Anzahl der Zeiteinheiten. Weil += Form auch für die Subtraktion genutzt werden muss, muss der Wert dafür mit negativem Vorzeichen angegeben werden.

Der Parameter Zeiteinheit] bestimmt die Zeiteinheit. Dafür sind folgende Angaben möglich:
  • S(seconds) - Sekunden
  • M(inutes) - Minuten
  • H(ours) - Stunden
  • D(ays) - Tage
Alle weiteren gewünschten Einheiten muss man selbst berechnen. Das ist für Wochen einfach, denn 1 Woche entspricht genau 7 Tagen. Bei Monaten hört es dann schon auf, denn weil die Monate unterschiedlich lang sind, gibt es die Gleichung 1 Monat = X Tage nicht. Mit Jahren ist es auch kompliziert, denn zur Umrechnung in Tage muss man auf die Schaltjahre achten.

Damit ist das Wesenliche auch schon abgehandelt. Will man 14 Tage zum heutigen Datum addieren, nehme man

Code: Select all

Heute := A_Now ; oder auch Heute := ""
Heute += 14, D
Will ich 14 Tage abziehen, nehme ich

Code: Select all

Heute := A_Now ; oder auch Heute := ""
Heute += -14, D ; man beachte das Minuszeichen
Bilden von Zeitdifferenzen:

Für das Bilden von Differenzen zwischen zwei Zeitstempeln ist Var -= Wert, Zeiteinheit da.

Die Variable Var muss dabei einen gültigen Zeitstempel bzw. den Anfang eines gültigen Zeitstempels enthalten. Sie darf auch gänzlich sehr sein, dann wird der vollständige aktuelle Zeitstempel verwendet.

Der Parameter Wert muss hier auch einen gültigen Zeitstempel bzw. den Anfang eines gültigen Zeitstempels enthalten. Er darf auch gänzlich sehr sein, dann wird der vollständige aktuelle Zeitstempel verwendet.

Der Parameter Zeiteinheit] bestimmt hier die Zeiteinheit, in der die Differenz gebildet werden soll. Die möglichen Werte entsprechen den oben aufgeführten.

Will man die Differenz vom 19.07.2015 zum heutigen Datum in Tagen berechnen, nimmt man

Code: Select all

Datum1 := A_Now ; oder auch ""
Datum2 := 20150719
Datum1 -= %Datum2%, D ; D = Tage
MsgBox, 0, Differenz, Seit dem 19.07.2015 sind %Datum1% Tage vergangen.
FormatTime:

Wie oben beschrieben, liefert AHK einige integrierte Variablen, die sich auf das aktuelle Datum bzw. die aktuelle Zeit beziehen. Für andere Daten/Zeiten kann man diese Werte über die Anweisung FormatTime mit den dort angegebenen Datums- bzw. Zeitformaten bekommen. Abgesehen von Unterschieden bei der Groß/Kleinschreibung reicht es in vielen Fällen, als Ausgabeformat den Namen der integrierten Variablen ohne das führende A_ zu nutzen. So bestimmt

Code: Select all

FormatTime, AusgabeVar, 20150719, WDay
die Nummer des Wochentags für den 19.07.2015 (Achtung: In AHK ist Sonntag der erste Wochentag!!!), entspricht also der Variablen A_WDay für das aktuelle Datum.

If Var Is Time:

Damit kann man prüfen, ob eine Variable einen gültigen Zeitstempel enthält. Statt Time kann man auch Date nehmen, wenn das besser passt. Anders als bei den oben beschriebenen Anweisungen wird eine leere Variable allerdings nicht durch den aktuellen Zeitstempel ersetzt. If Var Is Time liefert in diesem Fall Falsch, obwohl die Variable problemlos in den anderen Anweisungen genutzt werden könnte.
Last edited by just me on 22 Nov 2015, 06:35, edited 2 times in total.
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum und Zeit in AHK

Post by just me » 20 Nov 2015, 06:09

Alle sind herzlich eingeladen, Ihre nützlichen Funktionen zum Umgang mit Datum und Zeit einzustellen. Ich werde die Beiträge dann hier verlinken (falls erforderlich).
Auch Fragen können hier gern gestellt werden.
Last edited by just me on 23 Nov 2015, 04:03, edited 4 times in total.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Datum und Zeit in AHK

Post by jNizM » 20 Nov 2015, 06:16

LastSunday
Gebe mir den letzter Sonntag eines bestimmten Monats

Funktion:

Code: Select all

LastSunday(Date)
{
    Date += 31, D
    Date := SubStr(Date, 1, 6)
    Date += -1, Day
    FormatTime, WD, % Date, WDay
    Date += -(WD - 1), D
    return SubStr(Date, 1, 8)
}
Beispiel:

Code: Select all

MsgBox % LastSunday("201511")         ; ==> 20151129 (29.11.2015)
MsgBox % LastSunday(A_YYYY-1 "11")    ; ==> 20141130 (30.11.2015)
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum und Zeit in AHK

Post by just me » 21 Nov 2015, 04:45

Hallo jNizM,

das Ganze hier wendet sich ja an Leute, die mit Datum und Zeit in AHK nicht viel Erfahrung haben. Könntest Du deshalb Deinen Beitrag noch um eine Beschreibung ergänzen, warum das so funktioniert, wie es funktioniert?
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum und Zeit in AHK

Post by just me » 21 Nov 2015, 12:18

LDOM - Last Day Of Month / Letzter Tag des Monats

Die folgende Funktion ermittelt den letzten Tag eines Monats. Sie ist eine Abwandlung einer schon vor vielen Jahren in den goldenen AHK 1.0 Zeiten entwickelten Funktion. Als ich das zum ersten Mal gesehen habe, hat es etwas Zeit gebraucht, bis ich verstanden habe, wie das funktioniert:

Funktion:

Code: Select all

LDOM(Datum := "", Format := "") { ; letzter Tag des Monats - last day of month
   ; Wenn das Datum leer ist, wird es mit dem aktuellen Zeitstempel versorgt
   If (Datum = "")
      Datum := A_Now
   Else If Datum Is Not Date ; Sonst: Wenn Datum keinen gültigen Zeitstempel enthält, wird nichts zurückgegeben.
      Return ""
   ; Der Zeitstempel wird nötigenfalls durch das Addieren von 0 Sekunden auf 14 Stellen aufgefüllt.
   Datum += 0, S
   ; Wir brauchen davon nur den YYYYMM Teil (Jahr und Monat), d.h. die ersten 6 Stellen.
   Datum := SubStr(Datum, 1, 6)
   ; Im folgenden Befehl wird das Datum wieder auf 14 Stellen aufgefüllt (YYYYMM01000000), dazu werden 31 Tage addiert.
   Datum += 31, D
   ; Durch die Addition (01 + 31 = 32) sind wir im Folgemonat gelandet. Wir holen uns davon wieder den YYYYMM Teil.
   Datum := SubStr(Datum, 1, 6)
   ; Im folgenden Befehl wird das Datum wieder auf 14 Stellen aufgefüllt (YYYYMM01000000), davon wird 1 Tag abgezogen.
   ; Wir landen deshalb auf dem letzten Tag des Vormonats, d.h. des ursprünglichen Monats.
   Datum += -1, D
   ; Wenn der Parameter Format versorgt wurde, wird der Wert als Format für die Ausgabe von FormatTime verwendet
   ; und diese Ausgabe zurückgegeben.
   If (Format <> "") {
      FormatTime, Datum, %Datum%, %Format%
      Return Datum
   }
   ; Ansonsten wird der YYYYMMDD Teil (Jahr, Monat und Tag) des Zeitstempels zurückgegeben, d.h. die ersten 8 Stellen.
   Return SubStr(Datum, 1, 8)
}
Anwendungsbeispiele:

Code: Select all

MsgBox, % LDOM(201302) ; Februar 2013
MsgBox, % LDOM("" , "dd.MM.yyyy") ; aktueller Monat mit formatiertem Rückgabewert
User avatar
hoppfrosch
Posts: 443
Joined: 07 Oct 2013, 04:05
Location: Rhine-Maine-Area, Hesse, Germany
Contact:

Re: Datum und Zeit in AHK

Post by hoppfrosch » 23 Nov 2015, 00:47

Nur zur Info:

Ich hatte mal vor einiger Zeit die AHK-Foren nach Datum/Zeit Funktionalität durchforstet und als Gist zusammengetragen:
Hier noch der direkte Link: https://gist.github.com/hoppfrosch/6882628

Da könnte auch noch das eine oder andere nützliche dabeisein
Post Reply

Return to “Tutorials”