UTC DateTime conversion [Win API]
Posted: Thu Dec 03, 2015 12:48 pm
Did not found it in the forum right now. So here it is:
Code: Select all
; PB 5.41x86, Windows
; 03.12.2015 by dige
; With take care of daylight time
Procedure.I Time_UTC_to_Local(UTC_DateTime.I)
Protected UTC.SYSTEMTIME, LOCAL.SYSTEMTIME, Result.I
UTC\wYear = Year(UTC_DateTime)
UTC\wMonth = Month(UTC_DateTime)
UTC\wDayOfWeek = DayOfWeek(UTC_DateTime)
UTC\wDay = Day(UTC_DateTime)
UTC\wHour = Hour(UTC_DateTime)
UTC\wMinute = Minute(UTC_DateTime)
UTC\wSecond = Second(UTC_DateTime)
UTC\wMilliseconds = 0
SystemTimeToTzSpecificLocalTime_ (0, @UTC, @LOCAL)
Result = Date(LOCAL\wYear, LOCAL\wMonth, LOCAL\wDay, LOCAL\wHour, LOCAL\wMinute, LOCAL\wSecond)
ProcedureReturn Result
EndProcedure
Procedure.I Time_Local_to_UTC(DateTime.I)
Protected UTC.SYSTEMTIME, LOCAL.SYSTEMTIME, Result.I
LOCAL\wYear = Year(DateTime)
LOCAL\wMonth = Month(DateTime)
LOCAL\wDayOfWeek = DayOfWeek(DateTime)
LOCAL\wDay = Day(DateTime)
LOCAL\wHour = Hour(DateTime)
LOCAL\wMinute = Minute(DateTime)
LOCAL\wSecond = Second(DateTime)
LOCAL\wMilliseconds = 0
LibID = OpenLibrary(#PB_Any, "Kernel32.dll")
If LibID
CallFunction(LibID, "TzSpecificLocalTimeToSystemTime", 0, @LOCAL, @UTC)
CloseLibrary(LibID)
Result = Date(UTC\wYear, UTC\wMonth, UTC\wDay, UTC\wHour, UTC\wMinute, UTC\wSecond)
EndIf
ProcedureReturn Result
EndProcedure
; Take no care of daylight time
Procedure.I Time_UTC_to_Local (UTC_DateTime.q)
Protected UTC.FILETIME, LOCAL.FILETIME, Result.I
; FILETIME Raster 100 NanoSekunden = 10'-7
; Umrechnung von Sekunden in NanoSekunden
UTC_DateTime * 10000000
UTC\dwLowDateTime = UTC_DateTime & $FFFFFFFF
UTC\dwHighDateTime = (UTC_DateTime>>32) & $FFFFFFFF
FileTimeToLocalFileTime_(@UTC, @LOCAL)
UTC_DateTime = (LOCAL\dwLowDateTime&$FFFFFFFF) | (LOCAL\dwHighDateTime << 32)
Result = UTC_DateTime/10000000
ProcedureReturn Result
EndProcedure
Procedure.I Time_Local_to_UTC (DateTime.q)
Protected UTC.FILETIME, LOCAL.FILETIME, Result.I
; FILETIME Raster 100 NanoSekunden = 10'-7
; Umrechnung von Sekunden in NanoSekunden
DateTime * 10000000
LOCAL\dwLowDateTime = DateTime & $FFFFFFFF
LOCAL\dwHighDateTime = (DateTime>>32) & $FFFFFFFF
LocalFileTimeToFileTime_(@LOCAL, @UTC)
DateTime = (UTC\dwLowDateTime & $FFFFFFFF) | (UTC\dwHighDateTime << 32)
Result = DateTime/10000000
ProcedureReturn Result
EndProcedure