为什么我的SystemTimeToFileTime返回的结果是5小时?

时间:2011-06-21 16:19:57

标签: winapi vb6 systemtime filetime

如果我在±5小时的时区内,这是有意义的,但我在格林尼治标准时间-06:00,所以我不确定时区是我的问题还是其他的问题。这是我正在使用的代码:

Private Sub SetFileTimes(file As String, Optional creationTime As Date, Optional accessTime As Date, Optional writeTime As Date)
    Dim handle As Long
    Dim sysCreationTime As FileTime, sysAccessTime As FileTime, sysWriteTime As FileTime
    Dim SECURITY_ATTRIBUTES As SecurityAttributes
    SECURITY_ATTRIBUTES.nLength = Len(SECURITY_ATTRIBUTES)
    SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
    SECURITY_ATTRIBUTES.bInheritHandle = False
    handle = CreateFile(file & Chr$(0), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, SECURITY_ATTRIBUTES, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)
    Debug.Assert handle <> -1
    GetFileTime handle, sysCreationTime, sysAccessTime, sysWriteTime

    If creationTime <> 0 Then
        SystemTimeToFileTime GetSystemTime(creationTime), sysCreationTime
    End If
    If accessTime <> 0 Then
        SystemTimeToFileTime GetSystemTime(accessTime), sysAccessTime
    End If
    If writeTime <> 0 Then
        SystemTimeToFileTime GetSystemTime(writeTime), sysWriteTime
    End If

    SetFileTime handle, sysCreationTime, sysAccessTime, sysWriteTime
    CloseHandle handle
End Sub

Private Function GetSystemTime(datetime As Date) As SystemTime
    GetSystemTime.Year = Year(datetime)
    GetSystemTime.Month = Month(datetime)
    GetSystemTime.Day = Day(datetime)
    GetSystemTime.Hour = Hour(datetime)
    GetSystemTime.Minute = Minute(datetime)
    GetSystemTime.Second = Second(datetime)
    GetSystemTime.Milliseconds = 0
End Function

这个功能有效,但我的所有时间都提前了5个小时。 (例如,如果我尝试将日期设置为上午10点,则会将其设置为上午5点。)默认时间(我未指定的时间)不会像预期的那样发生变化。在调试时,我可以看到SystemTimeToFileTime返回的值小于它应该的值。我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

在夏令时期间,芝加哥(通常是GMT-06)是GMT-05。

修改:添加了FileTimeToLocalTime的链接。

答案 1 :(得分:2)

这是预期的行为。正如所指出的那样,在考虑DST时,关闭5个小时是有意义的。文件时间以UTC格式存储,因此将存在与当前时区的偏移量。

您似乎正确使用这些功能来设置文件时间:http://msdn.microsoft.com/en-us/library/ms724205(VS.85).aspx

如果您愿意,可以使用FileTimeToLocalTime对当地时区进行适当调整。

答案 2 :(得分:0)

您的creationTime和其他输入变量设置为什么?您的GetSystemTime()正在根据这些创建时间,并且不清楚返回的时间是否为UTC格式。

SystemTimeToFileTime的文档声明时间必须是UTC格式

http://msdn.microsoft.com/en-us/library/ms724948(VS.85).aspx

我怀疑您的代码中没有处理此转换。