AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP] Zeitzone berücksichtigen - Was mache ich falsch?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Matze · begonnen am 17. Aug 2008 · letzter Beitrag vom 28. Sep 2008
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

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

  Alt 17. Aug 2008, 23:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#2

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

  Alt 17. Aug 2008, 23:44
Also für PHP5 gäbe es das hier:

http://de3.php.net/date_default_timezone_set

Mit freundlichen Grüßen,

Valle
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 18. Aug 2008, 07:15
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
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 18. Aug 2008, 07:33
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 );
  }
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 18. Aug 2008, 08:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 7. Sep 2008, 12:06
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#7

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

  Alt 7. Sep 2008, 12:34
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).
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 7. Sep 2008, 13:27
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

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

  Alt 7. Sep 2008, 13:37
Hast du (um die differenz der Serverzeit zu bekommen) schon mmal date('Z') probiert?
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 7. Sep 2008, 15:25
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 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