[php] Datum / Uhrzeit in seine "einzelteile" zerlegen

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Hallo Ich habe ein Javascript Kalender der mir Onklick ein Datum mit Uhrzeit in ein Textform packt. In diesem Format: 20.03.06 09:14

Nun möchte ich aber das Datum und die Uhrzeit umwandeln in den Unix Timestamp. Ich habe gesehen das das mit mktime geht aber dazu müsste ich das Datum und die Uhrzeit in seine einzelnen Strings Zerlegen. Kann mir da wer helfen? Bei dem Datum wüsste ich das aber da nun dann die Uhrzeit dahinter ist bin ich da bissel überfordert :/ :freak:

Danke für eure Hilfe !
 
Phux schrieb:

Hallo,

preg_match_all wäre meine Meinung nach besser geeignet als substr().

Hier mal nen kurzes Snippet:

PHP:
<?php
	/* Der Datumsstring. */
	$string = '20.03.2006 09:14';
	
	/* Der reguläre Ausdruck. */
	$preg = '/[\d]{2,4}/';
	
	/* Das Ergebnis-Array */
	$matches = array();
	
	/* Regulären Ausdruck anwenden. */
	preg_match_all($preg, $string, $matches);
	
	/* Das Ergebnis ausgeben. */
	print_r($matches);
?>

Das erzeugt folgende Ausgabe:
Code:
Array
(
    [0] => Array
        (
            [0] => 20
            [1] => 03
            [2] => 2006
            [3] => 09
            [4] => 14
        )
)


Ciao
 
Ich habe probiert das ganze nun in eine kleine Funktion zu packen .. aber irgendwie kann ich dann nicht auf die Einzelnen Elemente in dem Array zugreifen!


PHP:
function datumsplit($datum)
{
	/* Der reguläre Ausdruck. */
    $preg = '/[\d]{2,4}/';

    /* Das Ergebnis-Array */
    $matches = array();
    
    /* Regulären Ausdruck anwenden. */
    preg_match_all($preg, $datum, $matches);
  
    /* Das Ergebnis übergeben. */
return $matches;
}

$split = datumsplit("20.03.2006 09:14");
echo $split['0'];

Sollte er dann nicht 20 ausgeben ?!?
 
Es ist ein verschachteltes Array...
PHP:
echo $split[0][0];
echo $split[0][1];
...
echo $split[0][n];
...versuche es mal so ;)
 
Zuletzt bearbeitet:
Phux schrieb:
Hallo

Dann kannst Du mir ja sicher erklären, warum das besser geeignet ist.
Danke.

Hallo Phux,

Weil man bei substr entweder eine ewig lange Anweisung bzw. zusammen mit strpos die Anweisungen in eine Schleife packen müsste. Reguläre Ausdrücke sind zu diesem Zweck besser geeignet, da man keine Schleifen und keine mehrfachen Aufrufe der Funktion benötigt. Zugegeben sind sie relativ schwer zu lesen, habe da auch manchmal so meine Probleme, aber sie sind extrem leistungsfähig und noch dazu von der Bearbeitungsgeschwindigkeit schneller.

Du kannst ja mal als Anschauungsbeispiel das hier genannte Problem mit substr() coden und deine Lösung hier veröffentlichen. Dann machen wir mal nen Laufzeitbenchmark über beide Varianten.

Btw. Wenn man den regulären Ausdruck etwas ändert, akzeptiert er sogar das folgendes Format zusätzlich zu dem bereits genanntem.
PHP:
<?php
    /* Der Datumsstring. */
    $string = '20.3.2006 9:14';
    
    /* Der reguläre Ausdruck. */
    $preg = '/[\d]{1,4}/';
    
    /* Das Ergebnis-Array */
    $matches = array();
    
    /* Regulären Ausdruck anwenden. */
    preg_match_all($preg, $string, $matches);
    
    /* Das Ergebnis ausgeben. */
    print_r($matches);
?>
Code:
Array
(
    [0] => Array
        (
            [0] => 20
            [1] => 3
            [2] => 2006
            [3] => 9
            [4] => 14
        )
)

Spätestens hier, wärst Du mit deiner Lösung mit substr() vor ziemlich große Probleme gestellt.


Ciao
 
Zuletzt bearbeitet:
hab ma ne kleine frage zwischendurch: wie kommt man auf den regulären ausdruck? hab da schon einiges angeguckt, wenn man sich den arsch aufreist bekommt man ja wohl einen hin, aber kann man das nich irgendwie einfacher machen?
 
Ich hätte dann noch eine Frage hierzu.. und zwar habe ich ja nun die Funktion um das dazum zu zerlegen. Ich habe nun auch noch vor das datum wieder in ein Timestamp umzuwandeln. Ich brauche das getrennt weil ich von einem Js kalender ein Datum zerlegen will und das nachher in ein Timestamp umwandeln will. Aber irgendwie will das umwandeln in ein Timestamp nicht funktionieren. Sieht vielleicht jemand ein Fehler?

PHP:
function datumsplit($datum)
{
/*
$matches[0][0] => Tag
$matches[0][1] => Monat
$matches[0][2] => Jahr
$matches[0][3] => Stunde
$matches[0][4] => Minute
*/

// Die Funktion Zerlegt das Datum und Die uhrzeit in ihre bestandteile
	/* Der reguläre Ausdruck. */
    $preg = '/[\d]{2,4}/';

    /* Das Ergebnis-Array */
    $matches = array();
    
    /* Regulären Ausdruck anwenden. */
    preg_match_all($preg, $datum, $matches);
  
    /* Das Ergebnis übergeben. */
return $matches;
}


function date_to_timestamp($datum) {
$datumsplit = datumsplit($datum);
$timestamp = mktime($datumsplit[0][3],$datumsplit[0][4],"00",$datumsplit[0][1],$datumsplit[0][0],$datumsplit[0][2]);
return $timestamp;
}

Dann:

echo date_to_timestamp("23.03.2006 04:03");
Ergebnis: 1143082980

echo date_to_timestamp("01.03.2006 09:03");
Ergebnis: 1143082980

ich kann machen was ich will.. ich bekomme immer 1143082980 heraus... aber per phpmyadmin generiert kommt dort ein ganz anderer Timestamp raus:(

Vielen Dank
 
Zuletzt bearbeitet:
Also bei mir funktioniert das Ganze. Du kannst höchstens noch nen Cast auf integer machen bei mktime.

Hier mal das entsprechende Snippet:

PHP:
<?php

function datumsplit($datum)
{
// Die Funktion Zerlegt das Datum und Die uhrzeit in ihre bestandteile
    /* Der reguläre Ausdruck. */
    $preg = '/[\d]{1,4}/';

    /* Das Ergebnis-Array */
    $matches = array();
    
    /* Regulären Ausdruck anwenden. */
    preg_match_all($preg, $datum, $matches);
  
    /* Das Ergebnis übergeben. */
return $matches;
}


function date_to_timestamp($datum) {
	$datumsplit = datumsplit($datum);
	$timestamp = mktime((int) $datumsplit[0][3], (int) $datumsplit[0][4], 0, (int) $datumsplit[0][1], (int) $datumsplit[0][0], (int) $datumsplit[0][2]);
	return $timestamp;
}

echo '23.03.2006 04:03 =&gt; '.($tstamp = date_to_timestamp('23.03.2006 04:03')).' =&gt; '.date('d.m.Y H:i:s', $tstamp).'<br><br>';

echo '01.03.2006 09:03 =&gt; '.($tstamp = date_to_timestamp('01.03.2006 09:03')).' =&gt; '.date('d.m.Y H:i:s', $tstamp);

?>

Das erzeugt bei mir das hier:
Code:
23.03.2006 04:03 => 1143082980 => 23.03.2006 04:03:00

01.03.2006 09:03 => 1141200180 => 01.03.2006 09:03:00


@shady.

Leider gibt es keine Möglichkeit, das zu erleichtern. Im Grunde ist es fast schon ne eigene Programmiersprache und die muss man nunmal lernen. Musste ich auch und kriege es nun mit trial & error immer ganz gut hin. :) Hier gibt es ganz gute Infos zu Regulären Ausdrücken, die Seite ist aber in englisch: http://www.regularexpressions.info/

Ciao
 
Mit dem int komme ich nun auch auf 1143082980 und 1141200180. Aber in der Datenbank steht 1141246610 und 1143126277.. das ist das was ich nicht verstehe ?!?!?
 
Zurück
Oben