2011-01-05 2 views
11

저는 파일의 날짜 메타 데이터를 생성 시간, 마지막으로 수정 한 시간 등과 같이 기록하는 프로그램에서 작업하고 있습니다. 이전 버전의 프로그램은 VBA로 작성되었으며 문제의 파일에 대한IO.File.GetLastAccessTime이 1 시간 만에 해제되었습니다.

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 

출력 :이 같은 무언가를

나는 윈도우 찾아서에서 파일 속성에서 얻을 값입니다
?getfilelastaccesstime("SomePath") 
7/30/2010 2:16:07 PM 

. 행복.

이 기능을 VB.Net 앱에 이식하고 있습니다. 새 코드 :

Public Function GetLastAccessTime(ByVal FilePath As String) As Date 
    Return IO.File.GetLastAccessTime(FilePath) 
End Function 

단순함. 출력 :

?GetLastAccessTime("SomePath") 
#7/30/2010 3:16:07 PM# 

1 시간 후.

두 기능이 동일한 컴퓨터에서 실행되어 동일한 파일을 검사합니다. 나는 또한 같은 결과를 가진 IO.FileInfo 클래스를 사용하여 시도했다. 나는 수천 개의 파일을 검사했고 그들은 모두 한 시간 씩 꺼져 있습니다. 생성 시간 및 최종 수정 시간에 대한 다른 날짜 속성도 한 시간 씩 해제됩니다.

도움말!

컴퓨터의 시간대는 CST이며 일광 절약 시간제는 현재 적용되지 않았습니다.

Windows 7 64 비트 및 Windows XP 32 비트에서 문제가 재현되었습니다.

감사합니다.

2011년 1월 6일 업데이트 : 적절한 시간대 오프셋을 사용하여 UTC에서 원하는 날짜를 계산하기 위해 노력하고 제안 모든 사람에게

감사합니다. 현재로서는 그렇게 할만한 가치가없는 것으로 결정하고 있습니다. 이 특정 비즈니스 요구 사항의 경우 날짜 값을 말하는 것이 API가 작동하는 방식이기 때문에 기대했던 것과 다릅니다. 내가 이것을 "고치려고"하면 나는 그것을 소유하고, 나는 차라리 그렇게하지 않을 것이다.

단지 킥을 위해 좋은 오래된 Scripting.FileSystemObject를 사용하여 interop을 사용해 보았습니다. Windows Explorer와 동의 한 예상 결과를 System.IO에 비해 약 5 배의 성능 저하로 제공합니다. 그것이 밝혀지면 나는 윈도우즈 탐색기가 가진 것과 일치하는 날짜를 얻어야한다. 나는 총알을 물고이 길로 갈 것이다.

내가 시도 또 다른 실험은 C#을 통해 KERNEL32에서 GetFileTime API 함수에 직접가는

: 시간은 Windows 탐색기에서 시간 씩 System.IO가 정확하게 같은 행동의 결과

[DllImport("kernel32.dll", SetLastError = true)] 
private static extern bool GetFileTime(
IntPtr hFile, 
ref FILETIME lpCreationTime, 
ref FILETIME lpLastAccessTime, 
ref FILETIME lpLastWriteTime 
); 

했다 .

다시 한 번 감사드립니다.

+2

는 – Flipster

+0

마지막 액세스 시간은 약 1 시간 단위를 가지고 나에게 일광 절약 시간 문제처럼 보인다. 또한 Windows Vista 이상에서는 기본적으로 [마지막 액세스 시간 값이 NTFS 볼륨에서 기본적으로 업데이트되지 않습니다.] (http://blogs.technet.com/b/filecab/archive/2006/11/07)에 유의하십시오. /disabling-last-access-time-in-windows-vista-to-improve-ntfs-performance.aspx). –

+0

DST가 유효하지 않지만 파일이 마지막으로 수정되었을 때 DST가 적용되었습니다. 누가 옳은가? 그 질문을하는 것을 피하기 위해 UTC에서 일하십시오. –

답변

3

XP/Win2k3/Vista에서는 .NET 4.0 및 2.0/3.5를 사용하여 재현 할 수 있습니다.

DST가 현재 DST와 다른 상태이며 .NET에서이 차이를 Explorer와 Scripting.FileSystemObject과 다르게 처리합니다.

(DST는 파일을 압축했다 때와 다른 경우 압축 파일에서 파일을 추출 할 때 당신은 유사한 문제를 볼 수 있습니다.)

통해 반사경, 이유 .NET이 아닌 .NET 코드 경로와 다릅니다 IO.File (및 IO.FileInfo)의 세 가지 로컬 날짜 스탬프는 모두 Utc 날짜 스탬프를 얻고 을 적용하여 현지 시간대 에서 DST가 발생했는지 여부에 따라 추가 할 오프셋을 결정합니다..

작년 7 월 1 일로 날짜를 변경하고 파일을 만들고 현재 날짜 (3 월 16 일)로 돌아가서 타임 스탬프를 확인하여 확인했습니다. (저는 남호주에 있으므로 DST에 있습니다. 지금은 7 월 1 일이 아니 었음), Windows (아마도 FileSystemObject)는 NOW에 DST를 추가하므로 실제로 표시된 시간이 변경됩니다.

요약하면 .NET은 더 정확합니다. 당신이 잘못된하지만 탐색기와 같은 날짜에 사용하려는 경우

는하지만 : 이것은 Raymond Chen's blog에 논의 된

Public Function GetLastAccessTime(ByVal FilePath As String) As Date 
    Return IO.File.GetLastAccessTimeUtc(FilePath) _ 
     .Add(TimeZone.CurrentTimeZone.GetUtcOffset(Now)) 
End Function 

을 요약입니다 (: .NET은 항상 반전 직관적으로 올바른 것이 아니라, 및 Win32 엄격하게 정정되고 역전 가능하다).

0

GetLastAccessTimeUtc으로 시도해보십시오. 현지 시간 및 일광 절약 시간제라고 생각됩니다.

0

글쎄 ... 내 Windows 7 컴퓨터에서 재현 할 수는 없지만 주간 조명 절약 문제처럼 들립니다.당신은 예를 들어, 날짜 출력을? 서식을 현재의 문화를 사용하는 경우

+0

컴퓨터의 시간대는 CST이며 일광 절약 시간제는 현재 적용되지 않고 있습니다. 감사. –

+1

@ 로거 - VB.Net의 SetLastAccessTime을 사용하여 파일에 수동으로 값을 설정 한 다음 VBA에서 값을 읽으면 어떻게됩니까? VBA와 Windows 탐색기는 코드에서 설정 한 시간과 동일한 시간을 보여 줍니까? 흥미로운 테스트일지도 모릅니다. – Peter

0

당신은 무엇을 어떻게해야합니까 ...

Dim dt As DateTime = System.IO.File.GetLastAccessTime(FilePath) 
    If Not dt.IsDaylightSavingTime() Then 
     dt.AddHours(1) 
    End If 

실험 빼기/추가하는 여부에 요구 될 수있다 : 당신은 뭔가를 시도 할 수 있습니다

Dim dt As DateTime = System.IO.File.GetLastAccessTime(FilePath) 
Dim dateText As String = dt.ToString(System.Globalization.CultureInfo.CurrentCulture) 
+0

깔끔한 아이디어! 불행히도 이전과 같은 잘못된 시간을 보냈습니다. –

0

은 이미 나는이에 대한 답은 UTC 시간을 사용하는 것입니다 생각하고, 당신이 '로컬'입니다 몇시 알 필요가 있다면 그 특정의 일광 절약 시간을 기준으로 현지 시간을 일을 언급 현재 문화권 정보를 사용하여 특정 시점을 지정합니다. 아주 사소한 일은 아니지만 적어도 주위의 일은 해결할 수 있습니까?

0
Public Function GetLastAccessTime(ByVal FilePath As String) As Date 
    Return IO.File.GetLastAccessTime(FilePath).ToLocalTime() 
End Function 
0

당신은 감지 할 수있는 다음 코드를 사용하여 오프셋 :이 승 API에서 뭔가 표준을 사용해야하므로 시간대 바이올린을 허용하지 않습니다

'... 
Dim datetimeNow as DateTime = DateTime.Now 
Dim localOffset as TimeSpan = datetimeNow - now.ToUniversalTime() 
'... 

당신의 시간

0

VBA에 localOffset을 추가합니다.

  • 날짜 & 시간 속성으로 이동 먼저 확인 일광 절약 시간이 해제하고 결과를 비교
  • 다음 몇 가지 다른 것들에 시간대를 변경하고 두 응용 프로그램은
  • 는 UTC를 선택 행동하는 방법을 참조하십시오 나는 실험을 제안 시간대 및

혹시 같은 마지막으로 액세스 한 시간을 얻을 것이다 어떻게되는지?

1

일광 절약 시간은 나를 위해 범인이었다. datDate에는 조정이 필요한 시간이 포함되어 있지만 "Now()"(위의 그림과 같이 매개 변수가 동일하지 않음)가 DST인지 여부 만 확인하면 해결됩니다.

If TimeZone.CurrentTimeZone.IsDaylightSavingTime(Now()) = True Then 
    datDate = DateAdd(DateInterval.Hour, -1, datDate) 
End If 
+0

나는 거의 아무데도 일광 절약 시간제가 1 시간이 아니라는 것을 알고있다. 그러나 이것을'= True'와 결합하여 나는 이것을 볼 때 거의 -1 번을 거의 클릭했다. –

0

이 문제가 발생했습니다. 나는 어떤 일이 일어나고 있는지 잘 알고 있습니다.

나는 PowerShell 스크립트 파일의 수정 된 날짜/시간을보고하는 CMD 스크립트 (DIR 명령을 사용하여)을 가지고있다. 최근 주간에서 표준 시간으로 변경된 Powershell 스크립트는 DIR 명령보다 한 시간 늦은 것으로 시간 변경 전에 만들어진 파일 시간을보고했습니다. Windows Explorer는 Powershell과 같은 시간을보고했습니다. NTFS 파일 타임 스탬프가 UTC로 저장되므로

, 그들은 디스플레이/출력을 현지 시간으로 변환 된 것된다. Powershell (및 Windows 탐색기)은 로컬 시간 오프셋을 사용하는 반면 DIR 명령은 UTC의 현재 시간대 오프셋 (시간대 표시 (+8, 태평양 표준 시간대의 표준 시간이므로 +8)을 사용합니다. 여전히 일광 절약 시간 이었기 때문에 UTC +7이었던 타임 스탬프 (파일이 생성되었을 때)에 효과가있었습니다.

나는 PowerShell을 변환 올바른 생각합니다. 나는 당신이 어느쪽으로 든 논쟁 할 수 있다고 생각하지만, 일광 절약 시간제 변경 전후의 타임 스탬프를 보면 Powershell 결과가 같고 DIR 결과가 다르고 일관성이 없습니다.

관련 문제