No VBA, como converter um carimbo de data / hora UTC do UNIX em Data do fuso horário local de uma maneira simples?
Como eu sei, podemos usar abaixo para converter aproximadamente um registro de data e hora do UNIX em uma data do VB
CDate ([carimbo de data / hora UNIX] / 60/60/24) + "1/1/1970"
No entanto, as informações de fuso horário e horário de verão não são consideradas.
O fuso horário não é grande coisa. Mas não consigo obter as informações de polarização da luz do dia para um carimbo de data / hora UNIX específico.
Embora o viés da luz do dia da data 1/1 seja obviamente diferente da data 6/1, no entanto, para a data 3/12 ou a data 11/5, o cálculo do viés da luz do dia é muito complexo.
Eu tentei várias APIs, como "FileTimeToLocalFileTime" e "GetTimeZoneInformation", mas nenhuma delas funciona.
Aqui está o meu código que não pode lidar com o viés da luz do dia
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function LocalFileTimeToFileTime Lib "kernel32" (src@, tgt@) As Long
Private Declare PtrSafe Function FileTimeToLocalFileTime Lib "kernel32" (src@, tgt@) As Long
#Else
Private Declare Function LocalFileTimeToFileTime Lib "kernel32" (src@, tgt@) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (src@, tgt@) As Long
#End If
Public Function ToUTC(ByVal datetime As Date) As Date
Dim ftLoc@, ftUtc@
ftLoc = (datetime - #1/1/1601#) * 86400000
LocalFileTimeToFileTime ftLoc, ftUtc
ToUTC = ftUtc / 86400000# + #1/1/1601#
End Function
Public Function FromUTC(ByVal datetime As Date) As Date
Dim ftUtc@, ftLoc@
ftUtc = (datetime - #1/1/1601#) * 86400000
FileTimeToLocalFileTime ftUtc, ftLoc
FromUTC = ftLoc / 86400000# + #1/1/1601#
End Function
Function getDateFromTimestamp(ByVal value) As Date
Dim t1, t2
t1 = CDate(value / 60 / 60 / 24) + "1/1/1970"
t2 = FromUTC(t1)
Debug.Print t2 - t1
getDateFromTimestamp = t2
End Function