... hat 'just me' einen satz funktionen bereitgestellt, welcher eine lokale systemabfrage zur 'sommer/winterzeit' ermöglicht!
Dazu wird aus der registry die lokale zeitzone ermittelt - und darauf basierend, ob ein zeitraum für 'sommer/winterzeit' (DSDT/STDT) definiert ist.
Nun ist es einfach festzustellen, ob die aktuelle systemzeit innerhalb dieses zeitraums liegt. Dazu benutzen wir eine funktion von 'VxE'.
Code: Select all
; https://autohotkey.com/boards/viewtopic.php?p=161785#p161785 by 'just me' TZI2TIMEZONEINFORMATION() DateTimeFromSYSTEMTIME() GetWDayInMonth()
; https://autohotkey.com/board/topic/70962-need-program-to-determine-if-date-is-in-a-certain-range by '[VxE] nli' DateBetween()
#NoEnv
#SingleInstance, Force
#Include DateBetween().ahk
MsgBox % GetDSDT("start") ; retourniert den zeitstempel zum beginn der lokalen sommerzeit
MsgBox % GetDSDT("e") ; retourniert den zeitstempel zum ende der lokalen sommerzeit
MsgBox % GetDSDT("end") ; retourniert den zeitstempel zum ende der lokalen sommerzeit
MsgBox % GetDSDT("period") ; retourniert den zeitstempel zur dauer/periode der lokalen sommerzeit
MsgBox % GetDSDT() ; retourniert ob die lokale systemzeit innerhalb der lokalen sommerzeit liegt
MsgBox % GetDSDT(20171029030000) ; retourniert das der 29.10.2017 03:00:00 (noch) innerhalb der lokalen sommerzeit liegt
MsgBox % GetDSDT(20171029030001) ; retourniert das der 29.10.2017 03:00:01 (schon) außerhalb der lokalen sommerzeit liegt
MsgBox % GetDSDT(20170330) ; retourniert das der 30.03.2017 bereits innerhalb der lokalen sommerzeit liegt
GetDSDT(req="") {
RegRead, TZ , HKLM,% "SYSTEM\CurrentControlSet\Control\TimeZoneInformation" , TimeZoneKeyName ; Ermitteln der lokalen zeitzone/timezone aus der registry
RegRead, REGTZI , HKLM,% "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\" TZ , TZI ; Ermitteln der dazugehörigen 'time zone information' (binärer wert)
TZI2TIMEZONEINFORMATION(REGTZI, TIMEZONEINFORMATION)
DSDT := DateTimeFromSYSTEMTIME(&TIMEZONEINFORMATION + 152) ; Ausgabe lokale sommerzeit (beginn) aus der TZI im format YYYYMMDD24HHMMSS
STDT := DateTimeFromSYSTEMTIME(&TIMEZONEINFORMATION + 68) ; Ausgabe lokale sommerzeit (ende) aus der TZI im format YYYYMMDD24HHMMSS
If req Is Date
Return % IsDateBetween(req,DSDT,STDT) = 0 ? "STDT" : "DSDT"
res := (req = "start" || req = "s") ? DSDT
: (req = "end" || req = "e") ? STDT
: (req = "period"|| req = "p") ? DSDT "-" STDT
: (req = "") ? IsDateBetween(A_Now,DSDT,STDT) = 0 ? "STDT" : "DSDT" ; Ermitteln ob das aktuelle systemdatum innerhalb des definierten zeitraum liegt (lokale sommerzeit)
: "ERROR"
Return % res
}
TZI2TIMEZONEINFORMATION(TZI, ByRef TIMEZONEINFORMATION) { ; Konvertiert 'time zone information'-werte in ein TIMEZONEINFORMATION struct
Bias := 0 ; Bias
StdD := 68 ; StandardDate
StdB := 84 ; StandardBias
DltD := 152 ; DaylightDate
DltB := 168 ; DaylightBias
VarSetCapacity(TIMEZONEINFORMATION, 172, 0)
IR := -1
Addr := &TIMEZONEINFORMATION + Bias ; Bias
Loop, 4
Addr := NumPut("0x" . SubStr(TZI, IR += 2, 2), Addr + 0, "UChar")
Addr := &TIMEZONEINFORMATION + StdB ; StandardBias
Loop, 4
Addr := NumPut("0x" . SubStr(TZI, IR += 2, 2), Addr + 0, "UChar")
Addr := &TIMEZONEINFORMATION + DltB ; DaylightBias
Loop, 4
Addr := NumPut("0x" . SubStr(TZI, IR += 2, 2), Addr + 0, "UChar")
Addr := &TIMEZONEINFORMATION + StdD ; StandardDate
Loop, 16
Addr := NumPut("0x" . SubStr(TZI, IR += 2, 2), Addr + 0, "UChar")
Addr := &TIMEZONEINFORMATION + DltD ; DaylightDate
Loop, 16
Addr := NumPut("0x" . SubStr(TZI, IR += 2, 2), Addr + 0, "UChar")
}
DateTimeFromSYSTEMTIME(Pointer) {
Year := NumGet(Pointer + 0, "Short")
Month := NumGet(Pointer + 2, "Short")
Day := NumGet(Pointer + 6, "Short")
Hour := NumGet(Pointer + 8, "Short")
Min := NumGet(Pointer + 10, "Short")
Sec := NumGet(Pointer + 12, "Short")
If (Year = 0) && (Month <> 0) {
Year := A_YYYY
Day := GetWDayInMonth(Year, Month, NumGet(Pointer + 0, "Short") + 1, Day)
}
; MsgBox % (Month = 0 ? "" : Format("{:04}-{:02}-{:02} {:02}:{:02}:{:02}", Year, Month, Day, Hour, Min, Sec))
; Return (Month = 0 ? "" : Format("{:04}-{:02}-{:02} {:02}:{:02}:{:02}", Year, Month, Day, Hour, Min, Sec)) ; YYYY-MM-DD HH:MM:SS
Return (Month = 0 ? "" : Format("{:04}{:02}{:02}{:02}{:02}{:02}", Year, Month, Day, Hour, Min, Sec)) ; YYYYMMDDHHMMSS
}
GetWDayInMonth(Year, Month, WDay, Occurence) {
YearMonth := Format("{:04}{:02}01", Year, Month)
If YearMonth Is Not Date
Return 0
If WDay Not Between 1 And 7
Return 0
If Occurence Not Between 1 And 5 ; 5 = last occurence
Return 0
FormatTime, WD, %YearMonth%, WDay
While (WD <> WDay) {
YearMonth += 1, D
FormatTime, WD, %YearMonth%, WDay
}
While (A_Index <= Occurence) && (SubStr(YearMonth, 5, 2) = Month) {
Day := SubStr(YearMonth, 7, 2)
YearMonth += 7, D
}
Return Day
}