In einem solchen Fall haben wir zwei Möglichkeiten. Ersten können wir die Zeitstempel vor dem Speichern entsprechend anpassen oder zweitens, wir führen einen Merker, der uns eine Nachberechnung der Zeitstempel ermöglicht.
Wie auch immer, wir müssen auf jeden Fall feststellen, wie die Uhrzeit in Bezug auf die Greenwich Mean Time (GMT) berechnet ist. Ein weiterer Aspekt dem wir Beachtung schenken müssen ist die Sommerzeit die u.a. in Mitteleuropa gilt. Hierdurch entsteht eine weitere Zeitverschiebung.
Im folgenden ein Codemuster, wie die entsprechenden Informationen aus Windows herausgekitzelt werden können. Benötigt wird übrigens die kernel32.dll.
* // Deklaration der Arbeitsvariablen
LOCAL lcTimeZoneDB as String, ;
liTimeZoneFlag as Integer, ;
lcTimeZoneDesc as String, ;
liTimeZoneOffset as Integer, ;
liGMTOffset as Integer, ;
liSUTOffset as Integer
* // Deklaration der Zeitzonen API Funktion und abrufen der Informationen
#DEFINE TIME_ZONE_SIZE 172
DECLARE Integer GetTimeZoneInformation IN kernel32 String @lpTimeZoneInformation
lcTimeZoneDB = REPLICATE( CHR( 0 ) , TIME_ZONE_SIZE )
liTimeZoneFlag = GetTimeZoneInformation( @lcTimeZoneDB )
* // Feststellen der Standard- und Sommerzeitabweichung
liGMTOffset = CTOBIN( SUBSTR( lcTimeZoneDB , 1 , 4 ) , [4RS] )
liSUTOffset = CTOBIN( SUBSTR( lcTimeZoneDB , 169 , 4 ) , [4RS] )
* // Feststellen der Zeitzonenabweichungen
IF liTimeZoneFlag = 2 && Sommerzeit Abweichung berücksichtigen
lcTimeZoneDesc = STRTRAN( STRCONV( SUBSTR( lcTimeZoneDB , 89 , 64 ) , 6 ) , CHR( 0 ) , [])
liTimeZoneOffset = ( liGMTOffset + liSUTOffset ) * 60
ELSE && Nur Standard GMT Zeit Abweichung
lcTimeZoneDesc = STRTRAN( STRCONV( SUBSTR( lcTimeZoneDB , 5 , 64 ) , 6 ) , CHR( 0 ) , [])
liTimeZoneOffset = liGMTOffset * 60
ENDIF
* // Informationsausgabe im _screen
CLEAR
lcFont = _screen.FontName
_screen.FontName = [Courier New]
?PADR([Zeitzone] , 25 , [ ] )
??TRANSFORM( liTimeZoneFlag ) + [ - ] + lcTimeZoneDesc
?PADR([Zeitverschiebung gesamt] , 25 , [ ] )
??[=] + TRANSFORM( ABS( liTimeZoneOffset ) ) + [ sek / ]
??[=] + TRANSFORM( INT( ABS( liTimeZoneOffset ) / 60) ) + [ min / ]
??[=] + TRANSFORM( INT( ABS( liTimeZoneOffset ) / 60 / 60) ) + [ std]
?PADR([GMT Verschiebung ] , 25 , [ ] )
??TRANSFORM( liGMTOffset ) + [ min]
?PADR([SOZ Verschiebung] , 25 , [ ] )
??TRANSFORM( liSUTOffset ) + [ min]
?PADR([MESZ] , 25 , [ ] )
??TIME()
?PADR([GMT] , 25 , [ ] )
??GETWORDNUM( CAST( DATETIME() + liTimeZoneOffset as C( 20 ) ) , 2 , [ ] )
_screen.FontName = lcFont
Keine Kommentare:
Kommentar veröffentlichen