Timestamp Zeitzonen

NullAhnung

Aktives Mitglied
guten morgen,

da ich gerade mir gedanken mache über die speicherung von irgendwelchen datume (sag man so) in meiner datenbank und ich dies gleich in hinsicht auf die verbreitung in mehren zeitzonen habe ich einige fragen....

- der timestamp ist doch die anzahl der sekunden seit dem 1.1.1970 00:00:00. ich unterstell mal, dass dies die greenwich zeit ist also zeitzone 0 oder ist das nicht so?

- wenn ich mit php einen timestamp mache, wird dann die zeit des servers genommen auf dem das script läuft?

- wenn ein user z.b. in der zeitzone 2 ein datum eingibt, muss ich dann den timestamp der daraus gebildet wird, um die 2 std. sprich 3600 reduzieren?

ich möchte in meiner datenbank das datum so abspeichern, dass diese timestamps miteinander vergleichbar sind....

 
Hi @NullAhnung,

QUOTE - der timestamp ist doch die anzahl der sekunden seit dem 1.1.1970 00:00:00. ich unterstell mal, dass dies
die greenwich zeit ist also zeitzone 0 oder ist das nicht so?


Der Timestamp geht meines Wissens immer vom Standpunkt bzw. von den Einstellungen des Servers aus. Das bedeutet, dass dieser Timestamp ist immer von der Zeitzone abhängig.


QUOTE - wenn ich mit php einen timestamp mache, wird dann die zeit des servers genommen auf dem das script läuft?


Diese Frage hab ich oben bereits mit beantwortet.


QUOTE - wenn ein user z.b. in der zeitzone 2 ein datum eingibt, muss ich dann den timestamp der daraus gebildet wird, um die 2 std. sprich 3600 reduzieren?


Dies wird etwas umfangreicher mit dem erklären:
1.) Du nimmst am besten erstmal den Timestamp deines Servers.
2.) Ich gehe davon aus, dass es sich um einen Standpunkt in Deutschland handelt, wenn ja, dann ziehst du 1*3600 von dem Timestamp und erhälst den Timestamp von der Zeitzone 0, denn Deutschland html die Zeitzone +1.
3.) Wenn du nun den Timestamp der Zeitzone +2 haben willst, rechnest du einfach 2*3600 und addierst diese zu dem Timestamp der Zeitzone 0 hinzu.
4.) Solltest du allerdings den Timestamp von der Zeitzone -2 brauchen, so zieht du diese 2*3600 von dem Timestamp der Zeitzone 0 ab.

Dabei ist allerdings auch noch zu beachten, ob es in dem gewünschten Land die Sommerzeit und Winterzeit gibt, daher solltest du die Länder auch noch mit abfragen und je nach Gegebenheiten die Sommerzeit mit in die Berechnung einfließen lassen, sonst wird dem User die falsche Uhrzeit angezeigt.

M.f.G. Matze202.

PS: Wenn du diese Daten in einer Datenbank abspeichern willst, rate ich dir, nimm zum abspeichern der Daten immer den Timestamp von deinem Server und berechne daraus an Hand der zusätzlich gespeicherten Daten, wie Zeitzonen Sommer und Winterzeit ja/nein, die für ihn benötigte Uhrzeit angezeigt, so kann es nicht passieren, dass 2 User in der selben Zeitzone, von denen einer Sommerzeit hat und der andere nicht, die selbe Uhrzeit präsentiert bekommen, denn diese würde bei einem, je nach Sommerzeit oder Winterzeit eventuell nicht stimmen.
 
Vielen Dank für die auführlichen Auskünfte....

na da haben die Erfinder des Timestamps nicht viel gedacht...um die Vergleichbarkeit zu gewährleisten wäre doch die Greenwich-Zeit sinnvoller gewesen, was ist den bei einem Umzug eines Servers in eine andere Zeitzone... dann geht das Rumtransformieren los....

das mit der Sommerzeit wäre meine nächste Frage gewesen... wenn ich dich richtig verstanden habe, dann springt also in der Nacht der Umstellung um 2.00 Uhr der Timestanp nicht um 3600 weiter...?

Der Umkehrschluss wäre also, wenn ich ein Timestamp als Datum anzeige, nehmen wir mal an vor 40 jahren, dann muss ich wissen, ob damals es in dieser Zeitzone eine Sommerzeit gab?

Also wäre es nicht einfacher das Datum abzuspeichern? Gut das Rechnen mit diesem Format ist dann schwieriger... oder geht es überhaupt z. B. den Unterschied zwischen 2 Datums auszurechnen ohne Timestamp....?

QUOTE PS: Wenn du diese Daten in einer Datenbank abspeichern willst, rate ich dir, nimm zum abspeichern der Daten immer den Timestamp von deinem Server


Wäre nicht sinnvoller, wenn Timestamp diesen immer auf Greenwich umzuwandeln.... dann wäre bei einem Umzug des Servers weniger Probleme... und dann für die Anzeige es entsprechend umzurechnen.... ?
 
Sinnvoll? Es mir sinnvoller, wenn die Timestamps den Servern angepasst sind, denn die meisten Server stehen in der selben Zeitzone, wie die meisten Nütze der Seiten auch sind. Sonst müssten ja alle anderen erst ihre Programmierung mit der Zeitzone erweitern.

Scheinbar hast du noch keine Zeitumstellung bewusst miterlebt? Es wird beim vorstellen schon einmal die Stunde übersprungen, somit +3600 gerechnet, und beim zurück stellen läuft die Uhr bis 3 Uhr und du rechnest dann -3600 und es läuft sozusagen die Zeit zwischen 2 und 3 Uhr doppelt.

Für ein Datum in der Vergangenheit, brauchst du doch keine Sommerzeit, sondern berechnest dir einfach den Timestamp aus dem Datum dazu, nimmst dazu Mittags 12 Uhr und berechnest dies mit den Zeitzonen, damit keiner das falsche Datum angezeigt bekommt.

Mit dem Datum abspeichern wird es seine Vor- und Nachteile haben, wenn der Termin z.B. überall ohne Umrechnung, sondern mit dem Vermerk der Zeitzone und Sommerzeit angezeigt wird, hat es seine Vorteile, sonst hat es große Nachteile.

Abspeichern des Timestamps kannst du selbst handhaben wie du es willst, aber in der Regel bleibst du doch in der selben Zeitzone und wenn nicht, dann rechnest du halt die Zeitzonenanpassung hinzu, das einzige das zu beachten wäre, ist die Sommerzeit.

Ich hoffe, ich könnte dir etwas helfen.

Gruß Matze202.
 
QUOTE (NullAhnung @ So 16.09.2012, 12:54)na da haben die Erfinder des Timestamps nicht viel gedacht...um die Vergleichbarkeit zu gewährleisten wäre doch die Greenwich-Zeit sinnvoller gewesen, was ist den bei einem Umzug eines Servers in eine andere Zeitzone... dann geht das Rumtransformieren los....

Du würdest es also besser finden wenn Du immer und immer und immer eine Stunde hinzuaddieren müstest?

CODE
$meinezeitzone = 1 * ( 60*60 );
$ts = time();
$D=date('d.m.Y H:i:s', $ts + $meinezeitzone );


oder

CODE
$meinezeitzone = 1 * ( 60*60 );
$ts = time() + $meinezeitzone;
$D=date('d.m.Y H:i:s', $ts );



gegen

CODE
$ts = time();
$D=date('d.m.Y H:i:s', $ts );




Das "meine Zeitzone" ist quasie schon drin

CODE
$D=date('d.m.Y H:i:s', 0 );


= 01.01.1970 01:00:00



QUOTE (NullAhnung @ So 16.09.2012, 12:54)Umzug eines Servers in eine andere Zeitzone... dann geht das Rumtransformieren los....

jaja, das gibt eine riesen Transformation
(wenn DU nach London umziehst)

CODE
$query = ' UPDATE ....
$query .= ' SET ts = ts - 3600



oder
Rechner in den Kofferraum ...... und dann wieder raus
dann hat der Rechner eine Andere Uhrzeit wie die Kirchuhr, lass die Serveruhr so wie sie ist und du brauchst nix transformieren
oder
Server in USA für eine Deutschländerforum, wäre es vielleicht sinvoll die Uhr auf Deutsche Zeit einzustellen



Sommerzeit
http://php.net/manual/de/function.date.php

CODE $D=date('I', $ts);

(großes 'i') Fällt ein Datum in die Sommerzeit 1 bei Sommerzeit, ansonsten 0

mit O P Z kannst Du abfragen wie der Unterschied zu England ist
und mit U kriegste deine Englandzeit


QUOTE (NullAhnung @ So 16.09.2012, 12:54) geht es überhaupt z. B. den Unterschied zwischen 2 Datums auszurechnen ohne Timestamp....?


Datum in Timestampt zurückwandeln und subtrahieren

http://php.net/manual/de/function.mktime.php
um ein Datum in einen Zeitstempel umzuwandeln

Der Befehl denkt mit

CODE $ts = mktime( 25, 61, 59, 12, 12, 12 ); $D=date('d.m.Y H:i:s',$ts);
13.12.2012 02:01:59

CODE $ts = mktime( 25, 61, 59, -5, 12, 12 ); $D=date('d.m.Y H:i:s',$ts);
13.07.2011 02:01:59

CODE $ts = mktime( 25, 61, 59, -5, 35, 12 ); $D=date('d.m.Y H:i:s',$ts);
05.08.2011 02:01:59
 
hallo

und vielen dank für die vielen ausführungen...aber irgendwie habe ich mein Problem wohl nicht so deutlich dargelegt....

ich möchte es mal kurz anhand eines bsp. erläutern....

ich habe eine db in die werden die datums von verschiedenen user und angenommen aus verschiedenen zeitzonen was eingeben....also z.b.

berlin um 14.30 .....Server steht in berlin
london um 13.31 .....Server steht in berlin
new york um 8.29 .....Server steht in berlin

so wenn ich den timestamp abspeichere, dann haben die doch die alle etwa den gleichen timestamp...weil der server in einer zeitzone steht... soweit so gut und die zahlen sind zu vergleichen usw.....

in meiner db werden also die folgende timestamps abgespeichert:
berlin 2010-01-01 14:30:00 lautet: 1262352600
london 2010-01-01 14:31:00 lautet: 1262352660
new york 2010-01-01 14:29:00 lautet: 1262352540

also schau ich als admin mir die datensätze an, dann kann ich sagen, dass z.b. der o.g. datensatz zum letzen mal aus london geändert wurde...also kann ich mir folgendes anzeigen, wenn ich z.b. in berlin sitze

new york 2010-01-01 14:29:00
berlin 2010-01-01 14:30:00
london 2010-01-01 14:31:00

würde ich diese abfrage in new york machen dann würde es so aussehen:
new york 2010-01-01 08:29:00
berlin 2010-01-01 08:30:00
london 2010-01-01 08:31:00

also alles kein problem, man könnte dann ja noch die ortszeit berechnen, weil ja der zeitunterschied fest ist und bekannt....dies hat ja aber nur mit der Anzeige zu tun und nichts mit den abgespeicherten werten in der db....

Nun ziehe ich mit einem teil des servers um, dann geht doch das Chaos los...also z.b.

berlin um 14.30 .....Server steht in berlin
london um 13.31 .....Server steht in berlin
new york um 8.29 .....Server steht in new york

dann würden doch folgende timestamp abgespeichert...
in meiner db werden also die folgende timestamps abgespeichert:

berlin 2010-01-01 14:30:00 lautet: 1262352600
london 2010-01-01 14:31:00 lautet: 1262352660
new york 2010-01-01 08:29:00 lautet: 1262330940

in diesem fall muss ich doch dann wissen, ab welchem datensatz ich umgezogen bin...usw...ich kann ja nicht die ganze db umwandeln...

und das war meine Überlegung... wenn ich von anfang an alles auf greenwich abspeichere, dann ist es doch völlig egal wo die server und ab wann stehen....die umrechnung auf die ortszeit, was ja nur für die ansicht notwendig ist, bleibt dann ja auch immer gleich...new york ist immter 6 std unterschied zu greenwich...

also ich habe doch dann für immer ruhe...was ich ja auch will...
deshalb habe ich die frage gestellt, ob der timestamp auf greenwich zeit oder lokal berechnet wird...






 
so nun habe ich einen kleinen test gemacht....

ich habe auf mehren Rechner verschiedene Zeitzonen eingerichtet und die timestamps mit javascript und php abgefragt...

CODE <script <type="text/javascript">
document.write(now.getTime());
</script>



CODE <script <type="text/javascript">
document.write(now.toString());
</script>



CODE <?php
$heute_php= time();
echo $heute_php;
?>



CODE <?php
$datum_php = date("d.m.Y H:m:s ",$heute_php);
echo $datum_php;
?>


Tue Sep 18 14:29:24 UTC+0200 2012 = javascript: 1347971364 456 php: 1347971363
auf dem anderen rechner...
Tue Sep 18 07:29:24 EST 2012 = javascript: 1347971364 656 php: 1347971364

meine schlussfolgerung ist eigentlich, dass der timestamp überhaupt nichts mit der zeitzone des servers zu tun hat... und vor allem nichts mit den zeitzonen nichts am hut hat, sondern sich auf greenwich bezieht...

oder irre ich mich da...
 
QUOTE (NullAhnung @ Di 18.09.2012, 12:19) new york um 8.29 .....Server steht in berlin



new york um 8.29 .....Server steht in new york

dann würden doch folgende timestamp abgespeichert...
in meiner db werden also die folgende timestamps abgespeichert:

berlin 2010-01-01 14:30:00 lautet: 1262352600
london 2010-01-01 14:31:00 lautet: 1262352660
new york 2010-01-01 08:29:00 lautet: 1262330940

in diesem fall muss ich doch dann wissen, ab welchem datensatz ich umgezogen bin...usw...ich kann ja nicht die ganze db umwandeln...

Wenn der Server umzieht, dann zieht doch wol die ganze DB auf diesem um,

also doch die ganze DB ändern und nicht "ab irgendeinem Datensatz"


http://php.net/manual/de/function.date.php
http://php.net/manual/de/function.date-def...imezone-set.php
http://php.net/manual/de/timezones.php
http://php.net/manual/de/timezones.europe.php


CODE
date_default_timezone_set('Europe/Berlin');
$ts=time();
$D=date('U d.m.Y H:i:s',$ts);
echo('<br>'.$D);



date_default_timezone_set('Europe/Moscow');
$ts=time();
$D=date('U d.m.Y H:i:s',$ts);
echo('<br>'.$D);



1347987872 18.09.2012 19:04:32
1347987872 18.09.2012 21:04:32

der time() liefert immer die selbe Zahl, die Zeitzohne wird beim date() eingearbeitet




Also
Du hast deinen GreenwitchTS
und brauchst zusätzlich noch deine Ortschaft in deiner DB um vor date() die Zeitzone zu defaulen
und dann kann dein Rechner auch soviel umziehen wie er will ..... hab ihn ja eben auch nicht nach Moscau gebracht
 
also die einfachste Lösung deines Problems ist, du stellst die uhrzeit all deiner Server auf deine Ortszeit, wo wahrscheinlich die meisten Server von dir stehen werden oder auf die zeitzone +/-0, denn dann läuft auf all deinen Server die selbe Uhrzeit.

das könnte dann zwar bedeuten, dass bei anderen Skripten, die ortsteil dann halt auch manuell wieder umgerechnet werden muss.

Gruß Matze202.
 
so jetzt werde ich wie folgt machen:

1. timestamp vom client...$timestamp
2. getTimezoneOffset mit speichern...$zeitzone

somit kann ich ohne Probleme einen quasi lokalen timestamp bei bedarf ermitteln...$timestamp - $zeitzone

Nur habe ich noch eine Frage...wenn ich das Datum anzeigen will möchte ich den korrigierten Timestamp benutzen....welchen php-befehl kann man dazu benutzen...also ohne dass die eingestellten timezonen verwendet werden...



 
Zurück
Oben