Ich arbeite an einem Programm, das Datum Metadaten von Dateien, wie Erstellungszeit, Zeitpunkt der letzten Änderung, etc. Eine alte Version des Programms wird in VBA geschrieben, und tut etwas wie folgt aus:IO.File.GetLastAccessTime ist um eine Stunde
Public Function GetFileLastAccessTime(ByVal FilePath As String) As Date
Dim fso As New Scripting.FileSystemObject
Dim f As Scripting.File
Set f = fso.GetFile(FilePath)
GetFileLastAccessTime = f.DateLastAccessed
End Function
Ausgang für die betreffende Datei:
?getfilelastaccesstime("SomePath")
7/30/2010 2:16:07 PM
, dass der Wert I aus den Dateieigenschaften in Windows Exploder erhalten ist. Glück.
Ich portiere diese Funktionalität in eine VB.Net App. Der neue Code:
Public Function GetLastAccessTime(ByVal FilePath As String) As Date
Return IO.File.GetLastAccessTime(FilePath)
End Function
Einfachheit selbst. Der Ausgang:
?GetLastAccessTime("SomePath")
#7/30/2010 3:16:07 PM#
Eine Stunde später.
Beide Funktionen laufen auf demselben Computer und überprüfen die gleiche Datei. Ich habe auch versucht, die Klasse IO.FileInfo mit dem gleichen Ergebnis zu verwenden. Ich habe Tausende von Dateien überprüft und sie sind alle um eine Stunde ausgeschaltet. Die anderen Datumseigenschaften für die Erstellungszeit und die Zeit für die letzte Änderung sind ebenfalls um eine Stunde abgelaufen.
Hilfe!
Ich habe vergessen, im ursprünglichen Beitrag zu erwähnen, Die Zeitzone des Computers ist CST, und Sommerzeit ist derzeit nicht wirksam.
Ich habe das Problem auf Windows 7 64 Bit und Windows XP 32 Bit reproduziert.
Danke.
2011.01.06 Update:
Dank an alle, die das gewünschte Datum aus UTC unter Verwendung der entsprechenden Zeitzone Offsets zu berechnen vorgeschlagen versuchen. Zu dieser Zeit bin ich der Meinung, dass es das Risiko nicht wert ist, dies zu tun. Für diese spezielle Geschäftsanforderung ist es viel besser zu sagen, dass der Datumswert nicht das ist, was Sie erwartet haben, weil das genau die Art ist, wie die API funktioniert. Wenn ich versuche, das zu "reparieren", dann besitze ich es, und das möchte ich lieber nicht.
Nur für Kicks habe ich versucht, die gute alte Scripting.FileSystemObject über Interop. Es gibt die erwarteten Ergebnisse, die mit Windows Explorer übereinstimmen, mit etwa 5-facher Leistungseinbußen im Vergleich zu System.IO. Wenn es sich herausstellt, dass ich Daten bekommen muss, die dem entsprechen, was Windows Explorer hat, werde ich in den sauren Apfel beißen und diesen Weg gehen.
Ein weiteres Experiment versuchte ich würde direkt an die Funktion GetFileTime API in kernel32 über C#:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetFileTime(
IntPtr hFile,
ref FILETIME lpCreationTime,
ref FILETIME lpLastAccessTime,
ref FILETIME lpLastWriteTime
);
, die in genau dem gleichen Verhalten führte System.IO hatte, war die Zeit weg von einer Stunde aus dem Windows Explorer .
Nochmals vielen Dank.
Sieht aus wie ein Problem mit der Sommerzeit für mich – Flipster
Last Access Time hat eine Granularität von ca. 1 Stunde. Beachten Sie außerdem, dass der Wert für die letzte Zugriffszeit in Windows Vista und höher standardmäßig nicht auf NTFS-Volumes aktualisiert wird (http://blogs.technet.com/b/filecab/archive/2006/11/07) /disabling-last-access-time-in-windows-vista-to-improve-ntfs-performance.aspx). –
DST ist jetzt nicht wirksam, aber * * war wirksam, als die Datei zuletzt geändert wurde. Wer hat Recht? Arbeiten Sie in UTC, um diese Frage nicht stellen zu müssen. –