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?
Zeit und Datei-Alter...
Unter Windows, nehme ich an. Folgende API-Funktionen sollten helfen:
Gruß, Little John
Code: Alles auswählen
GetTimeZoneInformation_()
FileTimeToLocalFileTime_()
Hier ein paar Codes:
Anzeige ala Windows:
Den Kompilierzeitpunkt von Exe-Dateien im PE-Format (wie sie z.B. PB erstellt) kann man so ermitteln:
Hier eine Zeitzonen-Auswertung:
Gruß
Helle
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
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
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$)
Helle