Neben der klassischen Datumsform „dd.mm.yyyy“ für „heute“ – was bereits eine Herausforderung sein kann – benötige ich regelmäßig „gestern“, „morgen“, „in vierzehn Tagen“, die Kalenderwoche oder andere Formatierungen, z.B. „yyyy-mm-dd“. Für die verschiedenen Varianten gehen mir langsam die Shortcuts für Autohotkey aus, deshalb sind die Funktionen in ein Pop-up-Menü umgezogen.
Für verschiedenste Datumsformate sind bei mir fast 20 verschiedene Shortcuts entstanden. Doch wenn ein Blick in das AutoHotkey-Script erforderlich ist, um den erforderlichen Shortcut nachzuschlagen, wird es kritisch. Außerdem stoßen die Shortcuts, die – um dem Namen gerecht zu werden – „short“ sein sollen, an die (Mengen-)Grenze der ursprünglich erdachten „Buchstabenlogik“ für den Aufruf. Ein Ärgernis sind diverse Formulare, die keine Datumseingabe mit Shortcuts ermöglichen, weil im Datumsfeld nur Zahlen erlaubt sind.Das lässt sich mit einem „Pop-up-Menü“ lösen, das mit einem einzigen Shortcut eine Liste bereitgestellter Varianten anzeigt. Die bereits erstellten Funktionen für die Tasten-Befehle konnten dafür 1:1 in eine „case“-Struktur für das Menü umziehen. Das erinnert auch daran, welche Datumsfunktionen es bereits gibt. Der Charme dieser Lösung: Weitere Funktionen lassen sich mühelos anhängen, was die Suche nach neuen Tastenfolgen erübrigt.
Der nachfolgende Code ist für Autohotkey 2.x geschrieben und öffnet das oben abgebildete Menü mit der Tastensequenz STRG
Win
D
in etwa über dem Cursor. Die Position wird korrigiert, wenn das Menü aus dem Rahmen fallen könnte. Wenn kein aktueller Eingabecursor ermittelt werden kann, erfolgt die Anzeige behelfsweise an der Mausposition. Die Positionierung ginge sicher eleganter und präziser, wäre dafür mit mehr Aufwand verbunden. Es hätte keinen Einfluss auf das Ergebnis, der Ausgabe des gewählten Formats an der aktuellen Cursorposition. Deshalb bleibt hier bewusst »Raum für individuelle Verbesserungen«.
ESC
schließt das Menü ohne Aktion, ist es offen, kann es mit den Pfeiltasten bedient werden. Beides liefert Autohotkey einfach so mit.
; ---- Menü für Datumsfunktionen ----
MDatum := Menu〈〉
MDatum.Add〈"Heute dd.MM.yyyy", MHDatum〉
MDatum.Add〈"Heute yyyy-MM-dd", MHDatum〉
MDatum.Add〈"Heute yyyymmdd", MHDatum〉
MDatum.Add〈"Heute yyyy-MM-dd HH:mm:ss", MHDatum〉
MDatum.Add〈"Heute HH:mm", MHDatum〉
MDatum.Add〈"KW heute", MHDatum〉
MDatum.Add〈"Gestern", MHDatum〉
MDatum.Add〈"Morgen", MHDatum〉
MDatum.Add〈"In 14 Tagen", MHDatum〉
MDatum.Add〈"In 14 Tagen mit Wochentag", MHDatum〉
MDatum.Add〈"In x Tagen …", MHDatum〉
MDatum.Add〈"In x Tagen mit Wochentag …", MHDatum〉
MDatum.Add〈"KW in x Wochen …", MHDatum〉
MDatum.Add〈"KW für Datum …", MHDatum〉
MDatum.Add〈"Tage seit …", MHDatum〉
MDatum.Add〈"Kalendertag für Datum …", MHDatum〉
MDatum.Add〈"KW in x Wochen", MHDatum〉
^#d::ShowMDatum〈〉 ; STRG WIN D
ShowMDatum〈〉 {
if CaretGetPos〈&x, &y〉 ; Cursorpos
{
x := Max〈0,x-80〉 ; „in etwa“ über dem Cursor positioneren
y := Max〈0,y-150〉 ; soweit das möglich ist
MDatum.Show〈x,y〉
}
else ; keine Cursorpos gefunden
MDatum.Show ; Am Mauszeiger anzeigen
}
; Funktion zum Behandeln der Menüauswahl
MHDatum〈ItemName, ItemPos, MDatum〉 {
switch ItemName ; Name → Änderungen erfordern kein „Nachsortieren“ von ItemPos
{
case "Heute dd.MM.yyyy" :
Send FormatTime〈A_Now,"dd.MM.yyyy"〉
case "Heute yyyy-MM-dd" : ;
Send FormatTime〈A_Now,"yyyy-MM-dd"〉
case "Heute yyyy-MM-dd HH:mm:ss" :
Send FormatTime〈A_Now, "yyyy-MM-dd HH:mm:ss"〉
case "Heute yyyymmdd" :
Send FormatTime〈A_Now,"yyyyMMdd"〉
case "Heute HH:mm" :
Send FormatTime〈A_Now,"HH:mm"〉
case "KW in x Wochen …" :
{
Anzahl := InputBox〈"KW in x Wochen", "KW Rechner", "W180 H160"〉
if Anzahl.Result = "ok"
{
Target := DateAdd〈A_Now,Anzahl.Value*7, "days"〉
Send "KW" . SubStr〈FormatTime〈Target,"YWeek"〉,5〉 . "/" . FormatTime〈Target,"yyyy"〉
}
}
case "KW heute" :
Send "KW" . SubStr〈formatTime〈A_Now,"YWeek"〉,5〉
case "Gestern" :
send FormatTime〈DateAdd〈A_Now,-1,"days"〉,"dd.MM.yyyy"〉
case "Morgen" :
send FormatTime〈DateAdd〈A_Now,1,"days"〉,"dd.MM.yyyy"〉
case "In 14 Tagen" :
send FormatTime〈DateAdd〈A_Now,14,"days"〉,"dd.MM.yyyy"〉
case "In 14 Tagen mit Wochentag" :
send FormatTime〈DateAdd〈A_Now,14,"days"〉,"dddd, dd.MM.yyyy"〉
case "In x Tagen …" :
{
Eingabe := InputBox〈"Heute + x Tage","Datumsrechnung","W240 T160"〉
if Eingabe.Result = "OK"
{
Send FormatTime〈DateAdd〈A_Now,Eingabe.value,"days"〉,"dd.MM.yyyy"〉
}
}
case "In x Tagen mit Wochentag …" :
{
Eingabe := InputBox〈 "Heute + x Tage","Datumsrechnung", "W240 T160"〉
if Eingabe.Result = "OK"
{
Send FormatTime〈DateAdd〈A_Now,Eingabe.value,"Days"〉,"dddd, dd.MM.yyyy"〉
}
}
case "Tage seit …" :
{
Eingabe := InputBox〈"Tage seit/bis zum… 〈dd.mm.yyyy〉","Tage rechnen", "W240 T160"〉
if Eingabe.Result = "ok"
{
Send DateDiff〈A_Now, Format〈"{3}{2:02}{1:02}", StrSplit〈Eingabe.Value, "."〉*〉, 'D'〉
}
Return
}
case "Kalendertag für Datum …" :
{
Eingabe := InputBox〈"… für Datum 〈tt.mm.jjjj〉","Kalendertag", "W240 T160"〉
if Eingabe.Result = "ok"
{
Target := Format〈"{3}{2:02}{1:02}", StrSplit〈Eingabe.Value, "."〉*〉
Send FormatTime〈Target,"dddd"〉
}
Return
}
case "KW für Datum …" :
{
Eingabe := InputBox〈"KW für Datum 〈tt.mm.jjjj〉","KW rechnen","W240 T160"〉
if Eingabe.Result = "ok"
{
Target := Format〈"{3}{2:02}{1:02}", StrSplit〈Eingabe.Value, "."〉*〉
Send "KW" . SubStr〈FormatTime〈Target,"YWeek"〉,5〉 . "/" . FormatTime〈Target,"yyyy"〉
}
}
case "KW in x Wochen" :
{
Anzahl := InputBox〈"KW in x Wochen", "KW Rechner", "W180 H160"〉
if Anzahl.Result = "ok"
{
Target := DateAdd〈A_Now,Anzahl.Value*7, "days"〉
Send "KW" . SubStr〈FormatTime〈Target,"YWeek"〉,5〉 . "/" . FormatTime〈Target,"yyyy"〉
}
}
}
}