Datum aus Integerzahl

Alles, was PHP betrifft, kann hier besprochen werden.

Datum aus Integerzahl

Postby juergen&lx » 16. December 2005 11:57

Hi,
ich hatte irgendwo mal eine function aufgebaut, :cry: die
eine 8stellige Zahl (Format yyyymmdd) in ein beliebiges Datum umwandelt.
Das neue Format sollte sein: dd.mm.yyyy :?:
Also 20051209 -->09.12.2005

Code: Select all
$d="20051209";
$jahr = substr($d, 0, 4);    // gibt "2005" zurück
$monat = substr($d, 4, 2);  // gibt "12" zurück
$tag = substr($d, -2);     // gibt "09" zurück

echo $datum = $tag.".".$monat.".".$jahr; 

//echo $datum= substr($d, -2).".".substr($d, 4. 2).".".substr($d, 0, 4);
//funktioniert nicht :(

hat jemand noch ne bessere Lösung?

Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Postby Wiedmann » 16. December 2005 12:52

Code: Select all
<?php
    $d = '20051209';
    $datum = preg_replace(
        '|(\d{4})(\d{2})(\d{2})|e',
        'checkdate("\\2", "\\3", "\\1") ? "\\3.\\2.\\1" : ""',
        $d
    );
    echo $datum;
?>
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby juergen&lx » 16. December 2005 13:13

Hi Wiedmann,

vielen Dank für die Antwort.
Ich hätt's wissen müssen, dass du immer noch Einen obendrauf setzt :wink:

Frage: ist denn dein Lösung nun schneller als meine?

Jürgen
juergen&lx
 
Posts: 154
Joined: 18. February 2004 21:36
Location: in einem Dorf am Rande des Strombergs
Operating System: Linux

Postby Wiedmann » 16. December 2005 13:28

Frage: ist denn dein Lösung nun schneller als meine?

k.a. siehe:
http://de.php.net/manual/en/function.mi ... p#AEN25844

Zumindest wird überpüft, ob überhaupt ein gültiges Datum vorliegt (checkdate) und wenn nein $datum mit einem Leerstring gesetzt. Könnte man auch ändern in "00.00.0000" oder was im Scriptverlauf besser passt.

Wenn du dir sicher bist, kannst du das checkdate() auch ganz weglassen:
Code: Select all
$datum = preg_replace('|(\d{4})(\d{2})(\d{2})|', '\\3.\\2.\\1', $d);


Noch eine Möglichkeit wäre:
Code: Select all
<?php
    $d = '20051209';
    $datum = date('d.m.Y', strtotime($d));
    echo $datum;
?>

Da muss das Datum halt in einen Timestamp passen. Geht dann also nicht mehr mit vielen Geburtsdaten.

Und dann ist da noch die Frage wo $d herkommt. Aus einer Datebank z.B. könnte man es sich ja auch gleich passend liefern lassen.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby KingCrunch » 16. December 2005 15:29

Da muss das Datum halt in einen Timestamp passen. Geht dann also nicht mehr mit vielen Geburtsdaten.

Warum? Daten vor 1970 kann man mit dem Timestamp doch darstellen...
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby Wiedmann » 16. December 2005 16:11

Daten vor 1970 kann man mit dem Timestamp doch darstellen...

Jein, ein Unix-Timestamp hat typischerweise den Bereich "01.01.1970 00:00:00" bis "19.01.2038 3:14:08" (positive Intergerwerte).

Ob ab PHP5.1.x das jetzt wirklich schon ab dem "13.12.1901 20:45:52" geht, hab ich noch nicht getestet (steht aber im Manual). Vor allem auf Windows (neagtiver Integerwerte).

Eine Timestamp-Spalte in MySQL ist von diesen Zeiten wiederum ganz unabhängig, da darin kein Unix-Timestamp gespeichert wird.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany


Return to PHP

Who is online

Users browsing this forum: No registered users and 12 guests