|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 06.05.2014, 16:43 Titel: Bestimmtes Datum als Änderungsdatum einer Datei setzen |
|
|
Hallo allerseits,
ich suche nach einer Möglichkeit, ein beliebiges Datum (hier: 24.12.2013, 12 Uhr) als Änderungsdatum einer Datei zu setzen. Für sämtliche Datums, die der aktuellen Zeitzone (Sommerzeit) entsprechen, klappt das auch. Das Beispieldatum liegt jedoch in der Winterzeit, als Ergebnis wird deshalb immer 11:00:00 anstelle der gewollten 12:00:00 angezeigt.
Das Problem ist, dass LocalFileTimeToFileTime offensichtlich zwar den aktuellen Zeitunterschied (2 Stunden zur UTC) berücksichtigt, nicht jedoch, dass das zu setzende Datum in der Winterzeit und damit in einer um eine Stunde abweichenden Zeitzone liegt. Kennt jemand eine andere Möglichkeit, so dass mir in den Dateieigenschaften 12 und nicht 11 Uhr angezeigt werden?
Code: | #INCLUDE ONCE "vbcompat.bi"
#INCLUDE ONCE "Windows.bi"
FUNCTION filehandel2( fname As String ) As HANDLE
Dim OFS As OFSTRUCT
OFS.cBytes = Len( OFS )
Function = Cast( HANDLE, OpenFile( fname, @OFS, OF_READWRITE ))
End FUNCTION
Function Serial2FTime( datser As Double ) As FILETIME
Dim As SYSTEMTIME sTime
Dim As FILETIME fTime, fTime2
sTime.wYear = Year ( datser )
sTime.wMonth = Month ( datser )
sTime.wDay = Day ( datser )
sTime.wHour = Hour ( datser )
sTime.wMinute = Minute( datser )
sTime.wSecond = Second( datser )
SystemTimeToFileTime( @sTime, @fTime )
LocalFileTimeToFileTime( @fTime, @fTime2 )
Function = fTime2
End FUNCTION
DIM AS INTEGER f=FREEFILE
OPEN "test.txt" FOR OUTPUT AS #f: CLOSE #f
DIM AS HANDLE FileHdl3
DIM As FILETIME lwTime
DIM As Double datv
FileHdl3 = FILEHANDEL2("test.txt")
datv = DateValue("24.12.2013") + TimeValue("12:00:00") 'Liegt in Winterzeit
'datv = DateValue("24.05.2013") + TimeValue("12:00:00") 'Liegt in Sommerzeit
lwtime = Serial2FTime( datv )
SetFileTime FileHdl3, @lwTime, NULL, @lwTime
CloseHandle( FileHdl3) |
|
|
Nach oben |
|
|
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 06.05.2014, 17:06 Titel: Re: Bestimmtes Datum als Änderungsdatum einer Datei setzen |
|
|
Do könntest versuchen folgende Funktionsreihenfolge zu verwenden.
FileTimeToSystemTime
SystemTimeToTzSpecificLocalTime
SystemTimeToFileTime |
|
Nach oben |
|
|
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 06.05.2014, 17:30 Titel: |
|
|
Damit erhalte ich 14 Uhr. So geht's also leider nicht. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 07.05.2014, 06:19 Titel: |
|
|
Hallo steini!
Bei mir (WinXP / FB 0.90.1) funktioniert dein o.g. Programmbeispiel sowohl für Sommer- als auch für Winterzeit einwandfrei. Hast du auf deinem Rechner die korrekte Zeitzone (GMT + 01:00) eingestellt?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 07.05.2014, 08:44 Titel: |
|
|
Hallo grindstone,
muss dann wohl an XP liegen, wobei mir das komisch vorkommt. Bei mir Win7 /FB 0.90.1 steht immer 11 anstelle von 12 Uhr.
Das Problem ist hier eindeutig die LocalFileTimeToFileTime, die ein gegebenes lokales Datum in UTC wandelt, und zwar unter Berücksichtigung der im System eingestellten aktuellen Zeitzone. Es setzt die UTC für BEIDE Datums also auf 2 Stunden früher, da ja aktuell Sommerzeit ist (UTC+2). Die Funktion berücksichtigt dabei eben nicht, dass das eine Datum in der Winterzeit liegt, wo die Abweichung ja nur eine Stunde beträgt. Genau das müsste aber berücksichtigt werden.
Was ich also bräuchte wäre eine Funktion, die einem Datum, das in der Winterzeit liegt, 1 Stunde, einem in der Sommerzeit 2 Stunden abzieht. Die aktuelle System-Zeitzone darf dabei überhaupt keine Rolle spielen. |
|
Nach oben |
|
|
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 07.05.2014, 09:17 Titel: |
|
|
Die Lösung scheint die Funktion TzSpecificLocalTimeToSystemTime zu sein! Allerdings bekommen ich auf genau diese Funktion keinen Zugriff, es erscheint immer "Variable not declared". Weiß jemand Rat?
Hier mal Schwarz auf Weiß der entscheidende Unterschied:
TzSpecificLocalTimeToSystemTime takes into account whether daylight saving time (DST) is in effect for the local time to be converted.
LocalFileTimeToFileTime uses the current settings for the time zone and daylight saving time. Therefore, if it is daylight saving time, this function will take daylight saving time into account, even if the time you are converting is in standard time.
Damit ist auch klar, wie die Abweichung von einer Stunde bei Verwendung der Funktion LocalFileTimeToFileTime zustande kommt.
Code: | #INCLUDE ONCE "vbcompat.bi"
#INCLUDE ONCE "Windows.bi"
FUNCTION filehandel2( fname As String ) As HANDLE
Dim OFS As OFSTRUCT
OFS.cBytes = Len( OFS )
Function = Cast( HANDLE, OpenFile( fname, @OFS, OF_READWRITE ))
End FUNCTION
Function Serial2FTime( datser As Double ) As FILETIME
Dim As SYSTEMTIME sTime
Dim As FILETIME fTime
sTime.wYear = Year ( datser )
sTime.wMonth = Month ( datser )
sTime.wDay = Day ( datser )
sTime.wHour = Hour ( datser )
sTime.wMinute = Minute( datser )
sTime.wSecond = Second( datser )
' TzSpecificLocalTimeToSystemTime( @sTime, @sTime) '<-- Variable not declared!
SystemTimeToFileTime( @sTime, @fTime )
Function = fTime
End FUNCTION
DIM AS INTEGER f=FREEFILE
OPEN "test.txt" FOR OUTPUT AS #f: CLOSE #f
DIM AS HANDLE FileHdl3
DIM As FILETIME cTime, lwTime
DIM As Double datv
FileHdl3 = FILEHANDEL2("test.txt")
datv = DateValue("24.12.2013") + TimeValue("12:00:00") 'Liegt in Winterzeit
lwtime = Serial2FTime( datv )
datv = DateValue("24.05.2013") + TimeValue("12:00:00") 'Liegt in Sommerzeit
ctime = Serial2FTime( datv )
SetFileTime FileHdl3, @cTime, NULL, @lwTime
CloseHandle( FileHdl3) |
|
|
Nach oben |
|
|
steini
Anmeldungsdatum: 17.09.2004 Beiträge: 58
|
Verfasst am: 07.05.2014, 11:36 Titel: |
|
|
TzSpecificLocalTimeToSystemTime kommt für mich nun doch nicht in Frage. Täte zwar, was es soll, ist aber nur ab XP bzw. Server 2003 aufwärts lauffähig und damit für mich nicht brauchbar.
Nach langem Probieren und Suchen bin ich nun aber doch ENDLICH auf eine universell funktionierende Lösung gekommen. Folgend der Code. Danke für eure Anteilnahme und auf Bald!
Code: | #Include ONCE "vbcompat.bi"
#INCLUDE ONCE "Windows.bi"
FUNCTION filehandel2( fname As String ) As HANDLE
Dim OFS As OFSTRUCT
OFS.cBytes = Len( OFS )
Function = Cast( HANDLE, OpenFile( fname, @OFS, OF_READWRITE ))
End FUNCTION
Function Serial2FTime( datser As Double ) As FILETIME
Dim As SYSTEMTIME sTime, sTime2
Dim As FILETIME fTime
Dim As Time_Zone_Information tz
sTime.wYear = Year ( datser )
sTime.wMonth = Month ( datser )
sTime.wDay = Day ( datser )
sTime.wHour = Hour ( datser )
sTime.wMinute = Minute( datser )
sTime.wSecond = Second( datser )
GetTimeZoneInformation(@tz)
tz.Bias = -tz.Bias
tz.StandardBias = -tz.StandardBias
tz.DaylightBias = -tz.DaylightBias
SystemTimeToTzSpecificLocalTime(@tz, @sTime, @sTime2)
SystemTimeToFileTime(@sTime2, @fTime)
Function = fTime
End FUNCTION
DIM AS INTEGER f=FREEFILE
OPEN "test.txt" FOR OUTPUT AS #f: CLOSE #f
DIM AS HANDLE FileHdl3
DIM As FILETIME cTime, lwTime
DIM As Double datv
FileHdl3 = FILEHANDEL2("test.txt")
datv = DateValue("24.12.2013") + TimeValue("12:00:00") 'Liegt in Winterzeit
lwtime = Serial2FTime( datv )
datv = DateValue("24.05.2013") + TimeValue("12:00:00") 'Liegt in Sommerzeit
ctime = Serial2FTime( datv )
SetFileTime FileHdl3, @cTime, NULL, @lwTime
CloseHandle( FileHdl3) |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|