# date() - eine Stunde zuviel



## Theeagle (19. September 2003)

Hi
Ich habe ein Problem mit der Zeitformatierung
Und zwar will ich aus die Sekunden aus einer Variable formatieren lassen!


```
echo date("h:i:s",$sek);
```

in $sek steht zum Beispiel der Wert 10
nun soll das Script 00:00:10 ausgeben!
Machts aber nicht
Es wir 01:00:10 ausgegeben....wo kommt diese Stunde her?

hängt das mit der einen Stunde Zeitunterschied in Deutschland zusammen
und wie kann ich den Wert ohne diese Stunde ausgeben?

Ich bin für jede Antwort dankbar

Theeagle


----------



## Tim C. (19. September 2003)

Also.
date() erwartet ja ein Parameter im UNIX-Timestamp Format. Der UNIX-Timestamp ist folgendermaßen definiert (Definition der Funktion time()).

_Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)._

Sprich wenn du ihm als Parameter 10 übergibts, entspricht das dem 1.1.1970 00:00:10 *GMT*. Greenwich Mean Time ist aber eine Zeitzone versetzt (früher) - in England halt. Und weil es am 1.1.1970 als es in Greenwich grade 00:00:10 war, hier schon 01:00:10 war und dein Server (PHP-Interpreter) wohl weiss, in welcher Zeitzone er steht ...

So müsste es sein. Würde mich wundern, wenn ich mich täusche


----------



## Subwoover (19. September 2003)

emm dein funktionsaufruf ist falsch!

```
date("d.m.y - H:i:s",time());
```
so wäre es etwa korrekt, du solltest deine sekundenzeit zuerst in einen timestamp umwandeln mittels:

```
mktime ( [int Stunde [, int Minute [, int Sekunde [, int Monat [, int Tag [, int Jahr [, int is_dst]]]]]]])
```

am besten zuerst date("d.m.y",time()) machen, dann mktime für deine sekundenzeit und dann die "neue" generierte zeit einfach mit date neu generieren!


----------



## Theeagle (19. September 2003)

@Subwoover. Ich will ja nicht die aktuelle Uhrzeit (time())  verwenden!
hmm..
Jetzt müsste ich meine Frage bissl umformulieren!
Also ich suche nun eine Alternative zu date(), da date() die 1h aufgrund von der Greenwich zeit immer dazuaddiert!
Der Alternative Befehl muss die Zeitzonen ignorieren!

bzw. brauche ich eine andere Möglichkeit um einen Sekundenwert in ein hh:mm:ss format zu bekommen ohne das irgendwas durch Zeitzonen verändert wird


----------



## Subwoover (19. September 2003)

geht ja so wie ichs dir gschrieben hab, also nochmal:


```
date ("d.m.Y",time());

$neuezeit  = mktime(deinestunde,deineminute,deinesekunde,deinmonat,deintag,deinjahr);

date ("H:i:s",$neuezeit);
```

probiers mal 
kannst ja jede zeit bei mktime einsetzn und bekommst neuen timestamp


----------



## Tim C. (19. September 2003)

Kann dieser hh:mm:ss Wert über 24:00:00 hinaus gehen ? Wenn ja müsstest du dir sowieso was eigenes schreiben, da sämtliche Datumsbezogenen Funktionen danach ja in den Tage-Bereich springen und die hh wieder bei 00 losgehen.


----------



## MiLa (20. September 2003)

HuHu,
bin grade aufgestanden  Alsow eis sich nicht so genau ob ich hier was zum Thema bringe 

Ich hatte es zumindest mal, dass die Uhrzeit des Linuxservers um eine Stunde falsch ging und ich den ersteinmal stellen musste... 
Hba am Script rumprobiert und geschraubt, aber das wollte einfach nicht funktionieren :/
Und dann bin ich irgendwann auf die Idee gekommen, dass es ja an dem Server selbst liegen könnte....und siehe da, das wars 

Wobei ich denke, dass dies nur bei eigenen Servern vorkommt 
Denke mal, dass die "großen" Hoster darauf schon achten


----------



## Tim C. (20. September 2003)

Schön Lars 

Aber das ist kein Fehler nirgendwo. Es ist einfach Fakt, dass wenn er einen timestamp = 10 übergibt, dass dem 1.1.1970 00:00:10 in GMT entspricht. Da wir aber GMT+1 sind ist timestamp=10 bei uns logischerweise 01:00:10 und in der Türkei wäre es 02:00:10 usw.

Selbst bei Hostern habe ich schon reichlich abenteuerliche Zeiteinstellungen gesehen  

Greetings
Tim


----------



## Gumbo (20. September 2003)

Wofür ihr in einem Tag nicht im Stande seid habe ich bloß ein paar Minuten gebraucht:
&nbsp;&nbsp;&nbsp;&nbsp;Was macht man, wenn eine analoge Uhr eine Stunde vor geht?
&nbsp;&nbsp;&nbsp;&nbsp;Man stellt sie einfach 23 Stunden vor, und schon wieder geht sie richtig:
[color="2c2c8c"]
&nbsp;&nbsp;<?php
&nbsp;&nbsp;&nbsp;&nbsp;$sek = 10;
&nbsp;&nbsp;&nbsp;&nbsp;echo(date("H:i:s",($sek+82800)));
&nbsp;&nbsp;?>
[/color]
Die 82800 setzen sich dabei aus 60&times;60&times;23 zusammen.


----------



## Tim C. (20. September 2003)

Gumbo, das hätte man auch anders sagen können. Als ob uns hier nicht klargewesen wäre, dass man auch einfach 23h vor, oder jeh nach timestamp auch 1h zurückstellen kann.

Es ging glaube ich in allen Beiträgen eher darum, zu ergründen, warum denn das Problem so ist. Da "stupide" 23h zuzuaddieren, ist ja nicht die große Kunst. Nur wenn es ihm im Endeffekt sogar darum gehen sollte, ein hh:mm:ss Formta zu erzeugen, was mehr als 24h anzeigen kann, dann muss er sich sowieso was andere überlegen.


----------



## Theeagle (20. September 2003)

So..da bin ich mal wieder 
Die Anzeige muss nicht über 24h hinaugehen Ich wollte es so machen das bei mehr Sekunden als 24h dann noch mit die Tage angezeigt werden!
Darum werd ich es so machen das bei unter 24h, 23h dazuaddiert werden und bei mehr als 24h, 1h subtraiert wird und das Format auf dd:hh:mm:ss wechselt!

Danke an alle die hier Fleißig mitgepostet haben.
(Wenn noch jemand eine bessere Lösung hat, immer her damit! )


----------



## Gumbo (21. September 2003)

Soetwas?

```
<?php
  function bla($sek) {
    $tag = 0; $std = 0; $min = 0;
    if(($sek/86400) >= 1) $tag = floor($sek/86400); $sek -= ($tag*86400);
    if(($sek/3600) >= 1) $std = floor($sek/3600); $sek -= ($std*3600);
    if(($sek/60) >= 1) $min = floor($sek/60); $sek -= ($min*60);
    if($std < 10) $std = "0".$std;
    if($min < 10) $min = "0".$min;
    if($sek < 10) $sek = "0".$sek;
    if($tag >= 2) {
      return($tag." Tage, ".$std.":".$min.":".$sek);
    } else {
       if($tag >= 1) {
        return($tag." Tag, ".$std.":".$min.":".$sek);
      } else {
        return($std.":".$min.":".$sek);
      }
    }
  }
  echo("weniger als 24 Stunden: <samp>".bla(86399)."</samp><br />");
  echo("mehr als 24 Stunden: <samp>".bla(172799)."</samp><br />");
  echo("mehr als 48 Stunden: <samp>".bla(259199)."</samp>");
?>
```


----------

