Почему мой SystemTimeToFileTime возвращает результат, который выключен на 5 часов? - PullRequest
1 голос
/ 21 июня 2011

Это имело бы смысл, если бы я находился в часовом поясе ± 5 часов, но я нахожусь в GMT -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 часов раньше.(IE Если я попытаюсь установить дату на 10 утра, вместо этого она будет установлена ​​на 5 утра.) Время по умолчанию (которое я не определяю) не меняется, как ожидалось.Во время отладки я вижу, что SystemTimeToFileTime возвращает значение меньше, чем должно быть.Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

3 голосов
/ 21 июня 2011

В летнее время в Чикаго (обычно GMT-06) используется GMT-05.

Редактировать: добавлена ​​ссылка на FileTimeToLocalTime .

2 голосов
/ 21 июня 2011

Это ожидаемое поведение. Как было отмечено, отключение на 5 часов имеет смысл при учете DST. Время файла хранится в формате UTC, поэтому будет смещение от вашего текущего часового пояса.

Похоже, что вы правильно используете функции для установки времени файла: http://msdn.microsoft.com/en-us/library/ms724205(VS.85).aspx

Вы можете использовать FileTimeToLocalTime , чтобы сделать соответствующую настройку для вашего местного часового пояса, если хотите.

0 голосов
/ 21 июня 2011

Для чего задано значение creationTime и другие входные переменные? Ваш GetSystemTime () создает время, основанное на них, и не ясно, будет ли возвращенное время в формате UTC.

Документы для SystemTimeToFileTime указывают, что время должно быть в формате UTC

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

Я подозреваю, что это преобразование где-то не обрабатывается в вашем коде.

...