Portal > Foren > PHP > PHP-Programmierung > Klasse zum Verwaltung von Zeitzonen auf UTC
Antwort
 
Themen-Optionen
Alt 01.05.2006, 23:06 Nach oben    #1
Jay
Gast
 
Beiträge: n/a
Standard Klasse zum Verwaltung von Zeitzonen auf UTC

Hey!

Ich bastle gerade an einer Klasse für ein OS Projekt, welche den Umgang mit den Zeitfunktionen und Zeitzonen/Zeitverschiebungen vereinfachen soll.

Grundsätzlich geht es darum, dass alle eingegebenen Zeiten in UTC berechnet, dann in der DB gespeichert und schließlich in beliebigen Zeitzonen wieder korrekt ausgegeben werden. Diese Klasse soll dem Programmierer die ganzen Berechnungen ersparen.

Ich würde jetzt gerne wissen was ihr von der Klasse haltet (was ist gut, was schlecht).

Der vielleicht etwas verwirrende Konstruktor Parameter $paramFormat, gibt an in welchem Format die Zeitstempel an die anderen Funktionen übergeben werden. (siehe Beispiel)

Hier mal der Code:
PHP-Code:
<?php
/**
 * Note: Although this class is called Time_UTC, it uses the GMT functions provided by PHP,
 * so there may be a time lag of max. 0,9 seconds between the real UTC time.
 */
class Time_UTC
{
    const 
UNIX_TIMESTAMP 'UNIX_TIMESTAMP';
    
    protected 
$timelag;
    protected 
$paramFormat;
    
    
/**
     * @param Integer $timezone
     * @param String $paramFormat
     */
    
public function __construct ($timezone$paramFormat self::UNIX_TIMESTAMP)
    {
        
$this->timelag 3600 $timezone;
        
$this->paramFormat $paramFormat;
    }
    
    
/**
     * @param mixed $utcDstStart
     * @param mixed $utcDstEnd
     * @param Integer $utcDstTimelag
     */
    
public function setDST ($utcDstStart$utcDstEnd$utcDstTimelag)
    {
        
$utcDstStart $this->parseTimeFormat ($utcDstStart);
        
$utcDstEnd $this->parseTimeFormat ($utcDstEnd);
        
        
$utcDstTimelag 3600 $utcDstTimelag;

        if (
time() >= $utcDstStart && time() <= $utcDstEnd)
        {
            
$this->timelag += $utcDstTimelag;
        }
    }

    
/**
     * @param String $paramFormat
     */
    
public function setParamFormat ($paramFormat)
    {
        
$this->paramFormat $paramFormat;
    }
    
    
/**
     * @param mixed $dateTime
     * @return Integer
     */
    
protected function parseTimeFormat ($dateTime) {
        
        
$params = array ('Y' => 0'm' => 0'd' => 0'H' => 0'i' => 0's' => 0);
        
        if (
$this->inputFormat == self::UNIX_TIMESTAMP)
        {
            return 
$dateTime;
        }
        
        foreach (
$params as $index => $value)
        {
            
$pos strpos ($this->inputFormat$index);
   
            if (
$pos !== false)
            {
                
$offset substr ($dateTime$pos4);
                
$number preg_replace ("~[^0-9]{1,4}[^.]+~",""$offset);
                
$dateTime substr ($dateTimestrlen ($number)-1);
                
$params[$index] = $number;
            }
            else 
            {
                
$params[$index] = 0;
            }
        }
        
        return 
gmmktime ($params['H'],
                         
$params['i'],
                         
$params['s'],
                         
$params['m'],
                         
$params['d'],
                         
$params['Y']);
    }
    
    
/**
     * @param mixed $locDateTime
     * @return Integer
     */
    
public function utcMktime ($locDateTime)
    {
        
$locDateTime $this->parseTimeFormat ($locDateTime);
    
        return 
$locDateTime $this->timelag;
    }

    
/**
     * @param mixed $utcDateTime
     * @param String $format
     * @return String
     */
    
public function utc2Local ($utcDateTime$format)
    {
        
$utcDateTime $this->parseTimeFormat ($utcDateTime);

        
$utcDateTime $utcDateTime $this->timelag;
        
        return 
gmdate ($format$utcDateTime);
    }

    
/**
     * @return String
     */
    
public function utc2DateTime ()
    {
        return 
gmdate ('Y-m-d H:i:s'time());
    }
}
Beispiel:
PHP-Code:
// Benutzer A wohnt in Österreich (hat +1h Zeitverschiebung und es ist
// gerade Sommerzeit).
// Benutzer A fügt einen Datensatz ein

// Die Zeitzone wird definiert (+1 Stunde Normalzeit) und das Format in
// dem die Zeitstempel übergeben werden (Standard wäre ein UNIX Zeitstempel)
$time = new Time_UTC (+1"Y-m-d H:i:s");
// Sommerzeit wird festgelegt
$time->setDST ("2006-03-26 3:00:00""2006-10-29 03:30:00", +1);

// die daten werden eingefügt und in UTC gespeichert
$sql 'insert into table (as, df, time)
        values ("asdf", "yxcv","'
.$time->utc2DateTime().'")';
mysql_query ($sql);

######################Neuer Request#######################

// Benutzer B wohnt in Hawaii (hat -10 Zeitverschiebung, derzeit keine
// Sommerzeit)
// Benutzer B liest den Datensatz, der von Benutzer A eingefügt wurde aus
// und bekommt ihn in der richtigen Zeit angezeigt

$time = new Time_UTC (-10"Y-m-d H:i:s");

$sql 'select * from table';
$result mysql_query ($sql);
while (
$line mysql_fetch_assoc ($result)) {
    
// alle daten ausgeben ....
    // .........................
    
    // Benutzer B bekommt das Datum in seiner Zeit (UTC -10) ausgegeben
    
echo $time->utc2Local($line['time'], "d/m/Y - H:i:s");

MfG Fat Tony
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.05.2006, 22:00 Nach oben    #2
Benutzer
 
Registriert seit: 31.12.2005
Beiträge: 90
Standard

Was genau gibt denn "Y-m-d H:i:s" im Konstruktor an?

Kann man das einfach weglassen, um nur den reinen Timestamp zu bekommen, den man dann selbst per date() formatiert ausgeben kann?

Also dass man praktisch nur sagt, in welcher Zeitzone man lebt (z.B. -10), dann den gespeicherten Timestamp per utc2Local() in den korrekten Timestamp umwandelt und diesen dann weiterverarbeiten kann ?!

Sonst sieht das eigentlich gut aus Auf jeden Fall hab ichs mal gespeichert
björn ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.05.2006, 00:17 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Ich frage mich, ob es nicht viel sinnvoller ist die Daten in einer Zeitzone zu speichern und dann beim Auslesen eventuelle Änderungen vorzunehmen.

Was passiert denn, wenn Du beim Auslesen der Datensätze nach dem Datum sortieren willst? Hab ich da irgendwas übersehen?

Weiterhin.
PHP-Code:
$time->setDST ("2006-03-26 3:00:00""2006-10-29 03:30:00", +1); 
Man muss manuell diesen Kram da der Methode übergeben?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.05.2006, 00:49 Nach oben    #4
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

also ich bevorzuge solche eingabemöglichkeiten, weil im kopf den timestamp z.b. von morgen 12:00 brauch ich wohl länger wie sowas einzugeben,

ausserdem wird hier:
PHP-Code:
// Die Zeitzone wird definiert (+1 Stunde Normalzeit) und das Format in
// dem die Zeitstempel übergeben werden (Standard wäre ein UNIX Zeitstempel)
$time = new Time_UTC (+1"Y-m-d H:i:s"); 
doch das format bestimmt, also absolut variabel.
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.05.2006, 03:03 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Na ist das da ein Beispiel und steht da normalerweise noch 'ne Methode oder Funktion oder wie?

Ich verstehe nicht, warum da ein fixes Datum drinsteht.
Die Frage zur Sortierung würdsch aber auch gerne noch beantwortet haben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.05.2006, 16:35 Nach oben    #6
Jay
Gast
 
Beiträge: n/a
Standard

Sortierung ist kein Problem, da die Daten halt nach GMT sortiert werden und bei der Ausgabe wird dann die Zeitverschiebung einfach addiert d.h. Sortierung ist kein Problem.

Zitat:
Na ist das da ein Beispiel und steht da normalerweise noch 'ne Methode oder Funktion oder wie?

Ich verstehe nicht, warum da ein fixes Datum drinsteht.
Normalerweise wirst du ja alle Daten, die du den Konstruktor übergibst z.B. die Sommerzeit und Zeitverschiebung aus der DB holen oder selbst berechnen. Und weil man eben die Daten nicht immer in einem UNIX Timestamp zur Verfügung haben wird, kann man im Konstruktor das Format festlegen. Standard ist UNIX_Timestamp.

MfG Fat Tony
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] PHPUnit oder testgetriebene Entwicklung mepeisen Tutorials 1 06.12.2007 10:56
Wert Varible in Listener anderer Klasse nutzen??? risa Desktop-Applikationen und Grafik 1 03.04.2006 07:36
Textfelder auf verschiedenen Tabs per Observer synchronisieren Sayang Desktop-Applikationen und Grafik 2 05.12.2005 19:14
[PHP] Aktuell gespielten Titel von XMMS auf einer Webseite in einer Grafik anzeigen Corvin Tutorials 0 28.11.2005 16:26
dynamischer Zugriff auf statische Eigenschaft einer Klasse Ben PHP-Programmierung 10 15.11.2005 15:53


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:32 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44