2013-07-25 2 views
9

Я написал код Excel VBA для добавления имен файлов, версий и последней измененной даты/времени на рабочий лист. Код работает нормально, за исключением того, что временная часть файла Last Modified Date для файла будет либо в 1 час вперед, либо назад от того, что я вижу в окне проводника.Получение последней измененной даты файла (значение проводника не cmd)

Я заметил, что значения, возвращаемые моим кодом, совпадают с измененной датой/временем, отображаемыми в CMD-окне, если я выполняю команду dir.

Например, если я смотрю на dbghelp.dll файла в system32 папки:

C:\Windows\System32>dir dbghelp.* 
Volume in drive C has no label. 
Volume Serial Number is 16E8-4159 

Directory of C:\Windows\System32 

21/11/2010 04:24   1,087,488 dbghelp.dll 
       1 File(s)  1,087,488 bytes 
       0 Dir(s) 60,439,101,440 bytes free 

C:\Windows\System32> 

Но тот же файл в окне проводника показывает модифицированное время 03:24 на 21/11/2010 - на 1 час раньше.

Код я написал возвращается ЦМД времени окна, в то время как я хочу, время окна проводника:

Sub GetFileDetails() 
    Dim path As String 
    Dim objFSO As Object 
    Dim objFile As Object 
    Dim objFolder As Object 
    Dim loopCount As Integer 
    Dim pathCheck As Boolean 


    'Prompt for directory path 
    path = InputBox(Prompt:="Enter file path", Title:="Enter file path", Default:="") 
    If (path = "" Or path = vbNullString) Then 
     MsgBox ("Invalid path - exiting") 
     Exit Sub 
    End If 

    'Required for interacting with filesystem 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objFolder = objFSO.GetFolder(path) 

    '1st row for path title, 2nd row for column headings 
    loopCount = 3 
    For Each objFile In objFolder.Files 
     Range("A" & loopCount).Value = objFile.Name 
     Range("B" & loopCount).Value = objFSO.GetFileVersion(objFile) 
     Range("C" & loopCount).Value = objFile.DateLastModified 

     'Combine Version and Modified 
     If Range("B" & loopCount).Value <> "" Then 
      Range("D" & loopCount).Value = Range("B" & loopCount).Value & ", " & Range("C" & loopCount).Value 
     Else 
      Range("D" & loopCount).Value = Range("C" & loopCount).Value 
     End If 

     loopCount = loopCount + 1 
    Next 

    'Set up headings 
    Range("A" & 1).Value = (loopCount - 3) & " files found in " & path 
    Range("A" & 2).Value = "FileName" 
    Range("B" & 2).Value = "Version" 
    Range("C" & 2).Value = "Modified" 
    Range("D" & 2).Value = "Version & Modified" 
End Sub 

Если кто-то может пролить некоторый свет на этот вопрос - он будет весьма признателен.

=== РЕДАКТИРОВАТЬ === Это код, который я придумал, который всегда дает мне то же самое время, показанное в окне проводника:

Sub GetFileDetails() 
    Dim path As String 
    Dim objFSO As Object 
    Dim objFile As Object 
    Dim objFolder As Object 
    Dim loopCount As Integer 
    Dim pathCheck As Boolean 

    Dim modDate As Date 
    Dim modHour As Integer 
    Dim modMin As Integer 

    'Prompt for directory path 
    path = InputBox(Prompt:="Enter file path", Title:="Enter file path", Default:="") 
    If (path = "" Or path = vbNullString) Then 
     MsgBox ("Invalid path - exiting") 
     Exit Sub 
    End If 

    'Required for interacting with filesystem 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objFolder = objFSO.GetFolder(path) 

    '1st row for path title, 2nd row for column headings 
    loopCount = 3 
    For Each objFile In objFolder.Files 
     Range("A" & loopCount).Value = objFile.Name 
     Range("B" & loopCount).Value = objFSO.GetFileVersion(objFile) 
     Range("D" & loopCount).Value = objFile.Name 


     'The date modified time for files made in Summer Time are correct, whereas Winter Time will be 1 hour forward 
     If (IsItSummerTime(objFile.DateLastModified) = True) Then 
      Range("C" & loopCount).Value = objFile.DateLastModified 
     Else 
      modDate = Format(objFile.DateLastModified, "DD-MM-YYYY") 
      modHour = Hour(objFile.DateLastModified) 
      modMin = Minute(objFile.DateLastModified) 

      modHour = modHour - 1 

      If (modHour < 10) Then 
       If (modMin < 10) Then 
        Range("C" & loopCount).Value = modDate & " 0" & modHour & ":0" & modMin 
       Else 
        Range("C" & loopCount).Value = modDate & " 0" & modHour & ":" & modMin 
       End If 
      Else 
       If (modMin < 10) Then 
        Range("C" & loopCount).Value = modDate & " " & modHour & ":0" & modMin 
       Else 
        Range("C" & loopCount).Value = modDate & " " & modHour & ":" & modMin 
       End If 
      End If 
     End If 

     'Combine Version and Modified 
     If Range("B" & loopCount).Value <> "" Then 
      Range("E" & loopCount).Value = Range("B" & loopCount).Value & ", " & Range("C" & loopCount).Value 
     Else 
      Range("E" & loopCount).Value = Range("C" & loopCount).Value 
     End If 

     loopCount = loopCount + 1 
    Next 

    'Set up headings 
    Range("A" & 1).Value = (loopCount - 3) & " files found in " & path 
    Range("A" & 2).Value = "FileName" 
    Range("B" & 2).Value = "Version" 
    Range("C" & 2).Value = "Modified" 
    Range("D" & 2).Value = "FileName" 
    Range("E" & 2).Value = "Version & Modified" 

End Sub 

Function IsItSummerTime(inDate As Date) As Boolean 
    Dim inDateYear As Integer 
    Dim findFirstSunday As Date 
    Dim firstSundayDate As Date 
    Dim startDays As Integer 
    Dim endDays As Integer 
    Dim summerStart As Date 
    Dim summerEnd As Date 

    'Summer Time starts on the 13th week 
    'Summer Time ends on the 42nd week 
    If (IsItALeapYear(inDate) = True) Then 
     startDays = (12 * 7) + 1 
     endDays = (42 * 7) + 1 
    Else 
     startDays = 12 * 7 
     endDays = 42 * 7 
    End If 

    'Find the date of the first Sunday in the year 
    inDateYear = Year(inDate) 
    For i = 1 To 7 
     findFirstSunday = DateSerial(inDateYear, 1, i) 
     If (Weekday(findFirstSunday) = 1) Then 
      firstSundayDate = findFirstSunday 
     End If 
    Next i 

    'Calculate the start and end dates for Summer Time 
    summerStart = firstSundayDate + startDays 
    summerEnd = firstSundayDate + endDays 

    'Compare inDate to Summer Time values and return boolean value 
    If (inDate >= summerStart And inDate < summerEnd) Then 
     IsItSummerTime = True 
    Else 
     IsItSummerTime = False 
    End If 
End Function 
Function IsItALeapYear(inDate As Date) As Boolean 
    If (Month(DateSerial(Year(inDate), 2, 29))) = 2 Then 
     IsItALeapYear = True 
    Else 
     IsItALeapYear = False 
    End If 
End Function 
+4

[см] (http://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug- и пробивной). – pnuts

+1

@pnuts - хорошая ссылка. – brettdj

+1

также хорошая поддержка [ответ] (http://superuser.com/questions/381110/windows-explorer-sees-different-file-name-from-cmd/381159#381159) –

ответ

1

Похоже, это в конечном счете ОС проблема, с которой вам пришлось бы работать, как было показано, тем более, что вы отредактировали свой код для учета DST.

Но вы также можете использовать функцию FileDateTime. В этом случае help article указывает, что результат этой функции основан на настройках локали вашей системы. В статье справки для свойства DateLastModified не указаны какие-либо оговорки, по крайней мере, для электронной справки Excel.

Чтобы изменить отрывок из отредактированной кода выше:

'1st row for path title, 2nd row for column headings 
loopCount = 3 
For Each objFile In objFolder.Files 
    Range("A" & loopCount).Value = objFile.Name 
    'use the full path name 
    Range("B" & loopCount).Value = FileDateTime(objFile_fullpathname) 
    Range("D" & loopCount).Value = objFile.Name