Datum und Zeit in AHK

Hilfreiche Erklärungen und Tipps zum Lernen von Autohotkey

Moderator: jNizM

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

Datum und Zeit in AHK

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] [Download] GeSHi © Codebox Plus

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

Code: [Select all] [Download] GeSHi © Codebox Plus

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] [Download] GeSHi © Codebox Plus

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

Code: [Select all] [Download] GeSHi © Codebox Plus

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] [Download] GeSHi © Codebox Plus

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] [Download] GeSHi © Codebox Plus

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.
Remaining with AHK 1.1.25.02 until v2 will become beta.
just me
Posts: 4685
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum und Zeit in AHK

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.
Remaining with AHK 1.1.25.02 until v2 will become beta.
User avatar
jNizM
Posts: 2281
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: Datum und Zeit in AHK

20 Nov 2015, 06:16

LastSunday
Gebe mir den letzter Sonntag eines bestimmten Monats

Funktion:

Code: [Select all] [Download] GeSHi © Codebox Plus

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] [Download] GeSHi © Codebox Plus

MsgBox % LastSunday("201511")         ; ==> 20151129 (29.11.2015)
MsgBox % LastSunday(A_YYYY-1 "11") ; ==> 20141130 (30.11.2015)
[AHK] 1.1.26.01 x64 Unicode | [WIN] 10 Pro (Version 1703) x64
My GitHub Profile | Donations are appreciated if I could help you
just me
Posts: 4685
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum und Zeit in AHK

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?
Remaining with AHK 1.1.25.02 until v2 will become beta.
just me
Posts: 4685
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datum und Zeit in AHK

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] [Expand] [Download] GeSHi © Codebox Plus


Anwendungsbeispiele:

Code: [Select all] [Download] GeSHi © Codebox Plus

MsgBox, % LDOM(201302) ; Februar 2013
MsgBox, % LDOM("" , "dd.MM.yyyy") ; aktueller Monat mit formatiertem Rückgabewert
Remaining with AHK 1.1.25.02 until v2 will become beta.
User avatar
hoppfrosch
Posts: 285
Joined: 07 Oct 2013, 04:05
GitHub: hoppfrosch
Location: Rhine-Maine-Area, Hesse, Germany
Contact:

Re: Datum und Zeit in AHK

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

Return to “Tutorials”

Who is online

Users browsing this forum: No registered users and 1 guest