Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Zeitzone berücksichtigen - Was mache ich falsch? (https://www.delphipraxis.net/118916-%5Bphp%5D-zeitzone-beruecksichtigen-mache-ich-falsch.html)

Matze 17. Aug 2008 23:29


[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:
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);
}
Hinter dem Code steckt folgende Überlegung:
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

Valle 17. Aug 2008 23:44

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Also für PHP5 gäbe es das hier:

http://de3.php.net/date_default_timezone_set

Mit freundlichen Grüßen,

Valle

Matze 18. Aug 2008 07:15

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

angos 18. Aug 2008 07:33

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 );
  }

Matze 18. Aug 2008 08:29

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Hallo!

Klasse, danke. Das funktioniert. Ich habe nun nach localtime() geschaut und dort gibt's sogar noch etwas kürzeres:

Code:
/**
 * 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
}
Grüße

Matze 7. Sep 2008 12:06

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:
function fetchGMT()
{
    return mktime () + ((date('O')/100 )/-1)*60*60 ;
}
oder

Code:
gmmktime();
Wenn ich das hier aufrufe:

Code:
echo date("d.m.Y H:s", $gmt_ts);
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.

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 in diesem Beitrag, doch irgendwie schaffe ich es nicht, das auf mein Problem zu übertragen, da ich nicht verstehe, was das alles macht. Speziell die letzte Funktion dort erscheint mir sehr seltsam.

Grüße

Phoenix 7. Sep 2008 12:34

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).

Matze 7. Sep 2008 13:27

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

jfheins 7. Sep 2008 13:37

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Hast du (um die differenz der Serverzeit zu bekommen) schon mmal date('Z') probiert?

Matze 7. Sep 2008 15:25

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:
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);
}
Das funktioniert soweit, nur wirft mir PHP im E_STRICT-Modus diese Fehler:

Code:
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
Kann man dagegen etwas tun? Denn time() wäre ja wieder nur die Serverzeit und nicht GMT.

Grüße

jfheins 7. Sep 2008 16:11

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Zitat:

Zitat von Matze
Kann man dagegen etwas tun? Denn time() wäre ja wieder nur die Serverzeit und nicht GMT.

Grüße

Hmm.... Wie wäre es damit: time() - date('Z') Sollte ähnliches tun ^^

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:

alcaeus 7. Sep 2008 16:20

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:
error_reporting(E_ALL);
Greetz
alcaeus

Matze 7. Sep 2008 16:27

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:
try
  // ...
except
end;
*g*

jfheins 7. Sep 2008 16:31

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Aber ist time() nicht gmtUTC ??

Matze 7. Sep 2008 16:32

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.

jfheins 7. Sep 2008 16:34

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 ;)

alcaeus 7. Sep 2008 16:59

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Zitat:

Zitat von Matze
@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:
try
  // ...
except
end;
*g*

Nicht ganz. Ich zitiere mal die PHP-Doku:
Zitat:

Run-time notices. Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code.
Der weisst dich darauf hin, dass es time() spaeter vielleicht irgendwann nicht mehr geben koennte. Mehr macht der auch nicht. Es ist also kein Fehler oder ne Warnung per se, sondern ein Vorschlag darauf zu verzichten, wenn dein Code spaeter ohne groessere Umbauten verwenden willst. That said, wenn du es trotzdem anders machen willst:

Code:
$utc_time = time() - date('Z') - (date('I') * 3600);
Greetz
alcaeus

jfheins 7. Sep 2008 17:05

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Zitat:

Zitat von alcaeus
Der weisst dich darauf hin, dass es time() spaeter vielleicht irgendwann nicht mehr geben koennte.

Andersrum (gmmktime könnte es bald nicht mehr geben), aber ist nicht so wichtig ;)


Zitat:

wenn du es trotzdem anders machen willst:

Code:
$utc_time = time() - date('Z') - (date('I') * 3600);
Greetz
alcaeus
Könnte es nicht vielleicht doch sein, dass time bereits gmt-Zeit zurückgibt?

alcaeus 7. Sep 2008 17:08

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Zitat:

Zitat von jfheins
Könnte es nicht vielleicht doch sein, dass time bereits gmt-Zeit zurückgibt?

Ja...aber auch nur dann, wenn die Zeitzone entsprechend eingestellt ist. Kann man uebrigens auch in der php.ini machen. Wie dem auch sei, dann sollte aber auch date('Z') 0 zurueckliefern ;)

Greetz
alcaeus

Matze 7. Sep 2008 17:15

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Also nun verstehe ich gar nichts mehr.

Das hier:

Code:
$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)';
liefert mir

Code:
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)
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:

Edit:
Code:
echo date("d.m.Y G:i:s Z", 0);
liefert
Code:
01.01.1970 1:00:00 3600
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.

Edit 2:
Nun verstehe ich noch weniger. Julius' Vorschlag mit

Code:
time() - date('Z')
liefert nun das korrekte Ergebnis. date() bzw time() enthält somit die Serverzeitzone inklusive Sommerzeit.

Matze 28. Sep 2008 12:15

Re: [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
 
Hallo,

nun nochmal das ganze von vorne. *g*

Ich habe mich nun entschlossen

Code:
date_default_timezone_set('GMT');
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:

Code:
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);
}
Da sind die Zeiten nun um eine Stunde falsch (bei eingestelltem GMT+1). Wie kann man das nun lösen?
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 09:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz