UTC DateTime conversion [Win API]

Share your advanced PureBasic knowledge/code with the community.
dige
Addict
Addict
Posts: 1409
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

UTC DateTime conversion [Win API]

Post by dige »

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

"Daddy, I'll run faster, then it is not so far..."