Delphi-PRAXiS
Seite 1 von 3  1 23      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr.
Seite 1 von 3  1 23      

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