![]() |
[PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hallo,
ich möchte abhängig von einer gewählten Zeitzone die Zeitangaben einer Website anpassen. Versucht habe ich es so:
Code:
Hinter dem Code steckt folgende Überlegung:
function get_time_str($timestamp, $format, $user_timezone_offset)
{ $gm_time = gmmktime(); // greenwich mean time (GMT) $server_time = time(); $server_time_offset = $server_time - $gm_time; return date($format, $timestamp + $user_timezone_offset - $server_time_offset); } Zuerst wird mit gmmktime der aktuelle Timestamp in der Greenwich-Zeitzone (GMT) ermittelt. Anschließend ermittle ich mit time den Timestamp mit der Zeitzone, die der Server eingestellt hat. Aus der Differenz erhalte ich nun die am Server eingestellte Zeitzone (als Sekunden-Offset bezogen auf die GMT). Vom zu formatierenden Timestamp ziehe ich nun den Offset des Servers ab und addiere den Offset des Benutzers. Ist mein Vorgehen denn richtig? Mein Problem ist nämlich, dass bei meinem Hoster $gm_time und $server_time identisch sind. Somit erhalte ich bei gewähltem Offset 3600 (GMT+1) eine Zeitangabe, die um 1 Stunde zu hoch ist. Ich möchte nicht in der php.ini oder ähnlichem Dinge anpassen müssen, sondern ausschließlich Standard-PHP-Funktionen verwenden. Grüße, Matze |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Also für PHP5 gäbe es das hier:
![]() Mit freundlichen Grüßen, Valle |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hallo,
diese Funktion habe ich auch gesehen, danke. Doch momentan nutze ich PHP 5.0.4 und es wäre schön, wenn ich das auch damit hinbekommen könnte. Was ist denn falsch an meiner Lösung? Grüße |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Moin moin,
hiermit sollte das gehen:
Delphi-Quellcode:
function get_zeitzonen_diff ( )
{ $iTime = time(); $ar = localtime ( $iTime ); $ar[5] += 1900; $ar[4]++; $timezonetime = gmmktime ( $ar[2], $ar[1], $ar[0], $ar[4], $ar[3], $ar[5], $ar[8] ); return ( $timezonetime - $iTime ); } |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hallo!
Klasse, danke. Das funktioniert. Ich habe nun nach ![]()
Code:
Grüße
/**
* This function returns the server timezone offset in seconds * e.g. Sydney in DST returns +1100 / 100 * 60 * 60 = 39600 */ function getServerTimeZoneOffset() { return date("O") / 100 * 60 * 60; // Seconds from GMT } |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hallo zusammen!
Ich habe feststellen müssen, dass seit einem Serverumzug die ganzen Zeiten nicht mehr stimmen und genau dies sollte nicht so sein. Wie kann man denn in PHP (wenn's geht < 5.1.0) den GMT-Timestamp ermitteln? Ich bin im Internet auf mehrere Lösungen gestoßen, doch keine funktioniert bei mir. Darunter waren u.a.
Code:
oder
function fetchGMT()
{ return mktime () + ((date('O')/100 )/-1)*60*60 ; }
Code:
Wenn ich das hier aufrufe:
gmmktime();
Code:
müsste ich doch eigentlich die aktuelle Ortszeit minus einer Stunde bekommen, da wir GMT+1 (bzw. aktuell GMT+2) sind, oder? Denn da kommt bei mir alles raus, nur nicht das.
echo date("d.m.Y H:s", $gmt_ts);
Hintergrund ist der, dass ich alle Timestamps, die ich in die Datenbank schreibe, auf GMT beziehen möchte, um so die vom Benutzer eingestellte Zeitzone berücksichtigen und drauf rechnen zu können. Nur muss ich auch noch irgendwie die Sommerzeit berücksichtigen. :gruebel: Einiges steht ![]() Grüße |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Du willst die Zeit doch für den Client anzeigen. (Warum eigentlich? Der hat doch in der Regel ne Uhr in der Taskleiste?).
Wenn Du aber eh die Client-Spezifische Zeit anzeigen lassen willst (und Du eh eine AJAX-Seite hast, wie ich annehme), warum zeigst Du dann nicht mit einem JavaScript-Einzeiler gleich Clientseitig die Client-Zeit an? Erspart Dir die ganze Umrechnerei auf dem Server. Vergiss es.. man sollte auch lesen... Es geht wohl nicht nur um die aktuelle Zeit... Trotzdem: Übertrage doch die Zeiten genauso, wie Du sie auf dem Server hast, zusammen mit der aktuellen Zeitzone des Servers. Die Umrechnung auf die Client-Zeit würde ich dann in Javascript auf dem Client machen. Der kennt seine Zeitzone und kann die Differenz entsprechend ausrechnen (und die paar Tags in denen die Zeit steht austauschen). |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hi Sebby,
ne JS ist Quatsch in dem Fall. Ich möchte es wie in der DP beispielsweise. Man kann im Profil die Zeitzone wählen und die berechnete Zeit zeigt es dann korrekt bei jedem einzelnen Beitrag an. Grüße |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hast du (um die differenz der Serverzeit zu bekommen) schon mmal date('Z') probiert?
|
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hi,
nein und ich habe soeben festgestellt, dass ich diese Differenz gar nicht benötige. Ich speichere die GMT-Zeit (ermittelt mit gmmktime()) und da genügt es, die Zeitzonen "aufzuaddieren":
Code:
Das funktioniert soweit, nur wirft mir PHP im E_STRICT-Modus diese Fehler:
function get_time_str($timestamp, $format, $user_timezone_offset)
{ $new_timestamp = $timestamp + $user_timezone_offset; // MS Windows could not handle negative timestamps if ($new_timestamp < 0) { return 'never'; } $summertime = date("I") * 60 * 60; // date("I") returns 1 if summertime is active, 0 if not return date($format, $new_timestamp - $summertime); }
Code:
Kann man dagegen etwas tun? Denn time() wäre ja wieder nur die Serverzeit und nicht GMT.
gmmktime() [[url='function.gmmktime']function.gmmktime[/url]]: You should be using the time() function instead
date() [[url='function.date']function.date[/url]]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Paris' for '2.0/DST' instead Grüße |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Zitat:
Und die zweite Meldung bekommst du weg, wenn du abfragst, ob es die funktion gibt, und dann ggf. aufrufst .. Oder rede ich da jetzt totalen Müll? :drunken: |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Moin,
error_reporting einfach auf E_ALL (ist bei PHP5 noch ohne E_STRICT) stellen, und das wars:
Code:
Greetz
error_reporting(E_ALL);
alcaeus |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
@Julius: Hm, das funktioniert bei mir leider nicht. Lokal ich bei mir time() das gleiche wie gmmktime() und date('Z') aber trotzdem 7200. :?
@Andy: Klar, dann sind die Fehler/Warnungen unterdrückt, aber das ist auch nicht das, was ich eigentlich gerne hätte. Das ist ja fast wie ein
Delphi-Quellcode:
*g*
try
// ... except end; |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Aber ist time() nicht gmtUTC ??
|
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Normalerweise müsste time() die am Server eingestellte Zeitzone verwenden (wenn nicht per PHP anders gesetzt).
Daher sehe ich das gerade als etwas widersprüchlich ein, weil date('Z') eine Differenz vorgibt. |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Könnte es nicht sein, dass date(Z) genau die differenz angibt, die du aufaddieren musst, um aus time() die lokale zeit zu machen?
In der Doku von time() steht zumindest was von gmt ;) |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Zitat:
![]() Zitat:
Code:
Greetz
$utc_time = time() - date('Z') - (date('I') * 3600);
alcaeus |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Zitat:
Zitat:
|
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Zitat:
Greetz alcaeus |
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Also nun verstehe ich gar nichts mehr.
Das hier:
Code:
liefert mir
$utc_time = time() - date('Z') - (date('I') * 3600);
echo date('d.m.Y G:i:s',$utc_time).' (utc von Andy) '; date_default_timezone_set('Europe/Berlin'); echo date('d.m.Y G:i:s').' (Berlin) '; date_default_timezone_set('Europe/London'); echo date('d.m.Y G:i:s').' (London) '; echo date('d.m.Y G:i:s', time()) . ' (time)';
Code:
In Berlin ist normalerweise GMT+1 und im Sommer GMT+2. Aber Andys Zeit wäre dann ja GMT-1 (oder falls UTC = GMT eben UTC-1). :freak:
07.09.2008 15:17:38 (utc von Andy)
07.09.2008 18:17:38 (Berlin) 07.09.2008 17:17:38 (London) 07.09.2008 17:17:38 (time) Edit:
Code:
liefert
echo date("d.m.Y G:i:s Z", 0);
Code:
Daher schließe ich daraus, dass irgenwas GMT+1 (= Serverzeitzone) sein muss, sonst stünde da 00:00:00, aber ich weiß auch nicht so genau. Das ist alles irgendwie unlogisch.
01.01.1970 1:00:00 3600
Edit 2: Nun verstehe ich noch weniger. Julius' Vorschlag mit
Code:
liefert nun das korrekte Ergebnis. date() bzw time() enthält somit die Serverzeitzone inklusive Sommerzeit.
time() - date('Z')
|
Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Hallo,
nun nochmal das ganze von vorne. *g* Ich habe mich nun entschlossen
Code:
zu verwenden. Für das Eintragen in die Datenbank funktioniert das auch, doch beim Auslesen gibt's Probleme, da das Datum bei der Formatierung mittels date() wohl wieder auf GMT umgerechnet wird. Folgende Funktion kann ich daher leider nicht mehr nutzen:
date_default_timezone_set('GMT');
Code:
Da sind die Zeiten nun um eine Stunde falsch (bei eingestelltem GMT+1). Wie kann man das nun lösen?
function get_time_str($timestamp, $format, $user_timezone_offset)
{ $new_timestamp = $timestamp + $user_timezone_offset; // MS Windows could not handle negative timestamps if ($new_timestamp < 0) { return 'never'; } $summertime = date("I") * 60 * 60; // date("I") returns 1 if summertime is active, 0 if not return date($format, $new_timestamp - $summertime); } Ich denke, vor und nach der Funktion jeweils date_default_timezone_set() aufzurufen würde keinen Sinn ergeben. Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz