Dienstag, 24. August 2010

Feststellen der aktuellen Zeitzone / Discover the current time zone

Wenn wir mit Daten arbeiten, die nicht nur in einer einzigen Zeitzone erfaßt werden, dann können wir nicht direkt mit der Uhrzeit der jeweiligen Arbeitsstation arbeiten. Dies würde die Erfassungszeitpunkte ad absurdum führen.

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