Seite 1 von 1

Zeit und Datei-Alter...

Verfasst: 25.11.2008 04:27
von KatSeiko
Ich habe zwei Dinge. Zuerst einmal habe ich eine Datei, von der ich erfahren möchte, wann sie erstellt wurde. Mein Programm lädt die Datei von meinem Server...

In der Datei steht unter Anderem die Differenz der Serverzeit zur UTC. Aber wie stelle ich fest, wie die Differenz zwischen der UTC und dem Rechner, auf dem mein Programm läuft, ist?

Verfasst: 25.11.2008 16:45
von Little John
Unter Windows, nehme ich an. Folgende API-Funktionen sollten helfen:

Code: Alles auswählen

GetTimeZoneInformation_()
FileTimeToLocalFileTime_()
Gruß, Little John

Verfasst: 25.11.2008 19:44
von Helle
Hier ein paar Codes:
Anzeige ala Windows:

Code: Alles auswählen

;PB 4.20 ,XP, kein Unicode
If OpenWindow(0, 0, 0, 400, 300, "Zeitangaben für Dateien", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TextGadget(0, 10, 10, 400, 20, "Datei auswählen :", #PB_Text_Center)  
  ExplorerTreeGadget(1, 10, 30, 380, 260, "*.*", #PB_Explorer_NoDriveRequester)
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow
      End 
    EndIf   
  Until EventType() = #PB_EventType_LeftDoubleClick And GetGadgetState(1) = #PB_Explorer_File
  File$ = GetGadgetText(1)
  hFile = ReadFile(0, File$)
  If hFile
    Create.FILETIME
    LastAccess.FILETIME
    LastWrite.FILETIME
    LocTime.SYSTEMTIME
    SysTime.SYSTEMTIME
    
    GetFileTime_(hFile, Create, LastAccess, LastWrite)  ;die 3 Zeiten auslesen
    
    FileTimeToLocalFileTime_(Create, LocTime)           ;erstellt am (hier GMT=UTC-Zeit)
    FileTimeToSystemTime_(LocTime, SysTime)             ;in lokale Zeit umrechnen    
    CTime$ = "Erstellt am "+Str(SysTime\wDay)+"."+RSet(Str(SysTime\wMonth),2,"0")+"."+Str(SysTime\wYear)
    CTime$ + " um "+Str(SysTime\wHour)+":"+RSet(Str(SysTime\wMinute),2,"0")+":"+RSet(Str(SysTime\wSecond),2,"0")+#LFCR$
   
    FileTimeToLocalFileTime_(LastWrite, LocTime)        ;geändert am (hier GMT=UTC-Zeit)
    FileTimeToSystemTime_(LocTime, SysTime)             ;in lokale Zeit umrechnen    
    GTime$ = "Geändert am "+Str(SysTime\wDay)+"."+RSet(Str(SysTime\wMonth),2,"0")+"."+Str(SysTime\wYear)
    GTime$ + " um "+Str(SysTime\wHour)+":"+RSet(Str(SysTime\wMinute),2,"0")+":"+RSet(Str(SysTime\wSecond),2,"0")+#LFCR$   
    
    FileTimeToLocalFileTime_(LastAccess, LocTime)       ;letzter Zugriff am (hier GMT=UTC-Zeit)
    FileTimeToSystemTime_(LocTime, SysTime)             ;in lokale Zeit umrechnen    
    LTime$ = "Letzter Zugriff am "+Str(SysTime\wDay)+"."+RSet(Str(SysTime\wMonth),2,"0")+"."+Str(SysTime\wYear)
    LTime$ + " um "+Str(SysTime\wHour)+":"+RSet(Str(SysTime\wMinute),2,"0")+":"+RSet(Str(SysTime\wSecond),2,"0")
       
    MessageRequester("Zeitangaben für " + File$, CTime$ + GTime$ + LTime$)
   Else
    MessageRequester("Fehler !", File$ + " will nicht !")
   
  CloseFile(0)
  EndIf
EndIf
Den Kompilierzeitpunkt von Exe-Dateien im PE-Format (wie sie z.B. PB erstellt) kann man so ermitteln:

Code: Alles auswählen

;PB 4.20 ,XP, kein Unicode
If OpenWindow(0, 0, 0, 400, 300, "Kompilierzeitpunkt von Exe - Dateien im PE - File - Format", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TextGadget(0, 10, 10, 400, 20, "Exe - Datei auswählen :", #PB_Text_Center)  
  ExplorerTreeGadget(1, 10, 30, 380, 260, "*.exe", #PB_Explorer_NoDriveRequester)
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow
      End 
    EndIf   
  Until EventType() = #PB_EventType_LeftDoubleClick And GetGadgetState(1) = #PB_Explorer_File
  File$ = GetGadgetText(1)
  If ReadFile(0, File$)
    FileSeek(0, $3C)                   ;Zeiger auf (eventuelle) PE-Kennung
    PEADR = ReadLong(0)
    FileSeek(0, PEADR)                 ;PE-Kennung
    If ReadLong(0) = $00004550         ;"PE  "
      FileSeek(0, PEADR + 8)           ;Kompilierzeitpunkt
      KompDatum = ReadLong(0)
      KompDatum$ = FormatDate("Jahr=%yyyy, Monat=%mm, Tag=%dd, Stunde=%hh, Minute=%ii, Sekunde=%ss",  KompDatum) 
      MessageRequester("Kompilierzeitpunkt von " + File$, KompDatum$)
     Else
      MessageRequester("Fehler !", File$ + " ist keine Datei im PE-File-Format !")
    EndIf
  CloseFile(0)
  EndIf
EndIf
Hier eine Zeitzonen-Auswertung:

Code: Alles auswählen

;PB 4.20 ,XP, kein Unicode

Global D$ 
Global W$

TZI.TIME_ZONE_INFORMATION 

Procedure Wochentag(D)
Select D
  Case 0 
    D$ = "Sonntag"
  Case 1 
    D$ = "Montag"
  Case 2 
    D$ = "Dienstag"
  Case 3 
    D$ = "Mittwoch"
  Case 4 
    D$ = "Donnerstag"
  Case 5 
    D$ = "Freitag"
  Case 6 
    D$ = "Samstag"
EndSelect 
EndProcedure

Procedure Woche(W)
Select W
  Case 1 To 4
    W$ = " am " + D$ + " der " + Str(W) + ". Woche des Monats"  
  Case 5
    W$ = " am " + D$ + " der letzten Woche des Monats"
EndSelect
EndProcedure

TZIR = GetTimeZoneInformation_(TZI)
Select TZIR
  Case #TIME_ZONE_ID_UNKNOWN                     ;= 0
    M$ = "Unbekannt"
    End 
  Case #TIME_ZONE_ID_STANDARD                    ;= 1
    M$ = PeekS(@TZI\StandardName, -1, #PB_Unicode) + #LFCR$ 
  Case #TIME_ZONE_ID_DAYLIGHT                    ;= 2
    M$ = PeekS(@TZI\DaylightName, -1, #PB_Unicode) + #LFCR$
  Case #TIME_ZONE_ID_INVALID                     ;= -1
    M$ = "Ungültig"
    End 
EndSelect

B$ = "Standard Unterschied zu UTC : " + Str(TZI\Bias) + " Minuten" + #LFCR$
SB$ = "Zusätzliche Abweichung : " + Str(TZI\StandardBias) + " Minuten" + #LFCR$
DL$ = "Sommerzeit-Unterschied : " + Str(TZI\DaylightBias) + " Minuten" + #LFCR$
S$ = "Umstellung auf Sommerzeit erfolgt im " + Str(PeekW(TZI\DaylightDate+2)) + ". Monat" ;oder Auswertung
N$ = "Umstellung auf Normalzeit erfolgt im " + Str(PeekW(TZI\StandardDate+2)) + ". Monat"

;Sommerzeit
D = PeekW(TZI\DaylightDate + 4)                  ;Wochentag der Umstellung
Wochentag(D)
W = PeekW(TZI\DaylightDate + 6)                  ;Woche des Monats
Woche(W)
S$ + W$ + " um " + Str(PeekW(TZI\DaylightDate + 8)) + " Uhr" + #LFCR$

;Normalzeit
D = PeekW(TZI\StandardDate + 4)                  ;Wochentag der Umstellung
Wochentag(D)
W = PeekW(TZI\StandardDate + 6)                  ;Woche des Monats
Woche(W)
N$ + W$ + " um " + Str(PeekW(TZI\StandardDate + 8)) + " Uhr"

MessageRequester("Zeitzone - Auswertung", M$ + B$ + SB$ + DL$ + S$ + N$)
Gruß
Helle