24.06.08, 18:43
|
#1 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
Beliebiges Datum per Format in Timestamp umwandeln
Hallo Leute,
ich bin gerade auf der Suche nach einer Funktion (sowas wie "parseDateByFormat") der ich einen String als Datum (z.B.'2008-06-14 17:43:02') und ein entsprechendes Format (z.B. 'Y-M-D H:i:s') übergebe und die mir aus diesen Angaben dann einen Unix-Timestamp macht. Das Format soll dabei variieren können (und das Datum vom Aufbau her auch!). Vielleicht bin ich ja nur zu blind und finde die Funktion (-skette) nicht. Ich bin kurz davor mir da selbst etwas zu basteln.
Danke für Eure Tips.
Gruß,
Shockshell
__________________
Nichts hält so lange wie ein Provisorium....
Geändert von shockshell (24.06.08 um 18:46 Uhr).
|
24.06.08, 18:52
|
#2 (permalink)
|
Registriert seit: Feb 2005
Ort: NRW
Beiträge: 460
Renommee-Modifikator: 12
|
AW: beliebiges Datum per Format in Timestamp umwandeln
|
24.06.08, 19:03
|
#3 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Hi,
das ist es gerade nicht was ich will, weil ich bei dieser Funktion bereits die einzelnen Segmente (Monat, Tag, etc.) extrahiert haben muss um sie an die Funktion zu übergeben. Ich befinde mich sozusagen davor. Ich habe einen Datum im Stringformat und ein dazugehöriges Format. Nun muss ich die einzelnen Teile des Datums diesem Format zuordnen. Sonst weiss ich nicht was ich in die Segmente eintragen muss. Und genau das ist es was mir fehlt. Der Rest (mktime) ist einfach.
Gruß,
shockshell.
__________________
Nichts hält so lange wie ein Provisorium....
Geändert von shockshell (24.06.08 um 19:08 Uhr).
|
24.06.08, 22:42
|
#4 (permalink)
|
|
Mitglied Gold
Registriert seit: Mar 2007
Ort: bei Freiburg
Beiträge: 132
Renommee-Modifikator: 6
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Wie wäre es denn mit der (fast) so genannten Funktion strtotime()?
|
24.06.08, 22:47
|
#5 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Das ist schon dicht dran, aber leider nur der halbe Weg. Ich kann leider nicht davon ausgehen, dass das Datum in einem "englischen" Format geliefert wird. Es sollte wie gesagt "beliebig" sein.
Gruß,
Shockshell
__________________
Nichts hält so lange wie ein Provisorium....
|
24.06.08, 23:09
|
#6 (permalink)
|
|
Mitglied Gold
Registriert seit: Mar 2007
Ort: bei Freiburg
Beiträge: 132
Renommee-Modifikator: 6
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Dann wirst du wohl an regulären Ausdrücken kaum vorbeikommen.
|
24.06.08, 23:11
|
#7 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Das hab ich mir fast schon gedacht. Bin gerade dabei mir etwas zu basteln. Werde meine Lösung bei Fertigstellung hier mal posten... Solange lasse ich das Thema noch als offen.
__________________
Nichts hält so lange wie ein Provisorium....
Geändert von shockshell (24.06.08 um 23:34 Uhr).
|
25.06.08, 00:26
|
#8 (permalink)
|
Registriert seit: Dec 2002
Ort: Trier
Beiträge: 17.516
|
AW: beliebiges Datum per Format in Timestamp umwandeln
|
PHP-Code:
|
|
function parseDateByFormat($date, $format) { $timestamp = null; $formatPatterns = array( 'a' => '(?P<a>am|pm)', 'A' => '(?P<A>AM|PM)', 'B' => '(?P<B>[0-9]{3})', // 'c' => '(?P<c>)', 'd' => '(?P<d>[1-9]|[12][0-9]|3[01])', 'D' => '(?P<D>Mon|Tue|Wed|Thu|Fri|Sat|Sun)', 'F' => '(?P<F>January|February|March|April|May|June|July|August|September|October|November|December)', 'g' => '(?P<g>[1-9]|1[0-2])', 'G' => '(?P<G>[0-9]|1[0-9]|2[0-3])', 'h' => '(?P<h>0[1-9]|1[0-2])', 'H' => '(?P<H>[01][0-9]|2[0-3])', 'i' => '(?P<i>[0-4][0-9]|5[0-9])', 'I' => '(?P<I>[01])', 'j' => '(?P<j>[1-9]|[12][0-9]|3[01])', 'l' => '(?P<l>Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)', 'L' => '(?P<L>[01])', 'm' => '(?P<m>0[1-9]|1[0-2])', 'M' => '(?P<M>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)', 'n' => '(?P<n>[1-9]|1[0-2])', 'O' => '(?P<O>[+\-][0-9]{4})', // 'r' => '(?P<r>)', 's' => '(?P<s>[0-4][0-9]|5[0-9])', 'S' => '(?P<S>st|nd|rd|th)', 't' => '(?P<t>28|29|30|31)', 'T' => '(?P<T>[A-Z]{3})', 'U' => '(?P<U>[1-9][0-9]*)', 'w' => '(?P<w>[0-6])', 'W' => '(?P<W>[1-9]|[1-4][0-9]|5[0-3])', 'Y' => '(?P<Y>[0-9]{4})', 'y' => '(?P<y>[0-9]{2})', 'z' => '(?P<z>[0-9]|[12][0-9][0-9]|3(?:[0-5][0-9]|6[0-5]))', 'Z' => '(?P<Z>-?(?:[0-9]|[1-9][0-9]{3}|[1-3][0-9]{4}|4(?:[0-2][0-9]{3}|3[01][0-9]{2}|3200)))', ); $regexp = preg_replace('/[a-zA-Z]/e', 'isset($formatPatterns["$0"])?$formatPatterns["$0"]:"$0"', $format); if (preg_match('/^'.$regexp.'$/', trim($date), $match)) { $values = array(0, 0, 0, 0, 0, 0, 0); foreach ($match as $format => $value) { if ($format == 'g' || $format == 'G' || $format == 'h' || $format == 'H') { $values[0] = $value; } else if ($format == 'i') { $values[1] = $value; } else if ($format == 's') { $values[2] = $value; } else if ($format == 'm' || $format == 'n') { $values[3] = $value; } else if ($format == 'd' || $format == 'j') { $values[4] = $value; } else if ($format == 'Y' || $format == 'y') { $values[5] = $value; } } $timestamp = mktime($values[0], $values[1], $values[2], $values[3], $values[4], $values[5]); } return $timestamp; } var_dump(parseDateByFormat('2008-06-14 17:43:02', 'Y-m-d H:i:s'));
|
__________________
Markus Wulftange
|
25.06.08, 09:48
|
#9 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Super! Passt (fast)
Musst beim kleinen d noch eine null am Anfang einfügen
|
PHP-Code:
|
|
(?P<d>[1-9]|[12][0-9]|3[01]) => (?P<d>0[1-9]|[12][0-9]|3[01])
|
Danke.
__________________
Nichts hält so lange wie ein Provisorium....
|
05.02.10, 19:20
|
#10 (permalink)
|
|
Tutorials.de Gastzugang
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Hallo zusammen,
ich hoffe jemand antwortet auf dieses doch schon etwas ältere Thema. Eventuell vllt auch Gumbo.
Die Funktion ist super, aber verursacht einen Fehler bei diesem Format: parseDateByFormat('March 10, 2001, 5:16 pm', 'F j, Y, g:i a')
Könnt ihr mir helfen?
|
05.02.10, 19:31
|
#11 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Wie lautet denn die Meldung?
__________________
Nichts hält so lange wie ein Provisorium....
|
05.02.10, 19:37
|
#12 (permalink)
|
|
Tutorials.de Gastzugang
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Keine Fehlermeldung. Nur der Timestamp ist falsch.
Der Response ist: Timestamp: 976421760 || Formatiert: 10.12.2000 05:16:00 date("d.m.Y H:i:s", Timestamp)
|
05.02.10, 20:02
|
#13 (permalink)
|
|
Mitglied Brokat
Registriert seit: Jun 2005
Ort: Buxtehude (Niedersachsen)
Beiträge: 255
Renommee-Modifikator: 11
|
AW: beliebiges Datum per Format in Timestamp umwandeln
Hiermit gehts:
|
PHP-Code:
|
|
function parseDateByFormat($date, $format) { $timestamp = null; $formatPatterns = array( 'a' => '(?P<a>am|pm)', 'A' => '(?P<A>AM|PM)', 'B' => '(?P<B>[0-9]{3})', // 'c' => '(?P<c>)', 'd' => '(?P<d>[1-9]|[12][0-9]|3[01])', 'D' => '(?P<D>Mon|Tue|Wed|Thu|Fri|Sat|Sun)', 'F' => '(?P<F>January|February|March|April|May|June|July|August|September|October|November|December)', 'g' => '(?P<g>[1-9]|1[0-2])', 'G' => '(?P<G>[0-9]|1[0-9]|2[0-3])', 'h' => '(?P<h>0[1-9]|1[0-2])', 'H' => '(?P<H>[01][0-9]|2[0-3])', 'i' => '(?P<i>[0-4][0-9]|5[0-9])', 'I' => '(?P<I>[01])', 'j' => '(?P<j>[1-9]|[12][0-9]|3[01])', 'l' => '(?P<l>Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)', 'L' => '(?P<L>[01])', 'm' => '(?P<m>0[1-9]|1[0-2])', 'M' => '(?P<M>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)', 'n' => '(?P<n>[1-9]|1[0-2])', 'O' => '(?P<O>[+\-][0-9]{4})', // 'r' => '(?P<r>)', 's' => '(?P<s>[0-4][0-9]|5[0-9])', 'S' => '(?P<S>st|nd|rd|th)', 't' => '(?P<t>28|29|30|31)', 'T' => '(?P<T>[A-Z]{3})', 'U' => '(?P<U>[1-9][0-9]*)', 'w' => '(?P<w>[0-6])', 'W' => '(?P<W>[1-9]|[1-4][0-9]|5[0-3])', 'Y' => '(?P<Y>[0-9]{4})', 'y' => '(?P<y>[0-9]{2})', 'z' => '(?P<z>[0-9]|[12][0-9][0-9]|3(?:[0-5][0-9]|6[0-5]))', 'Z' => '(?P<Z>-?(?:[0-9]|[1-9][0-9]{3}|[1-3][0-9]{4}|4(?:[0-2][0-9]{3}|3[01][0-9]{2}|3200)))', ); $regexp = preg_replace('/[a-zA-Z]/e', 'isset($formatPatterns["$0"])?$formatPatterns["$0"]:"$0"', $format); if (preg_match('/^'.$regexp.'$/', trim($date), $match)) { $values = array(0, 0, 0, 0, 0, 0, 0); foreach ($match as $format => $value) { if ($format == 'g' || $format == 'G' || $format == 'h' || $format == 'H') { $values[0] = $value; } else if ($format == 'i') { $values[1] = $value; } else if ($format == 's') { $values[2] = $value; } else if ($format == 'm' || $format == 'n') { $values[3] = $value; } else if ($format == 'd' || $format == 'j') { $values[4] = $value; } else if ($format == 'Y' || $format == 'y') { $values[5] = $value; }else if($format=='F'){ switch($value){ case 'January': $values[3]=1; break; case 'February': $values[3]=2; break; case 'March': $values[3]=3; break; case 'April': $values[3]=4; break; case 'May': $values[3]=5; break; case 'June': $values[3]=6; break; case 'July': $values[3]=7; break; case 'August': $values[3]=8; break; case 'September': $values[3]=9; break; case 'October': $values[3]=10; break; case 'November': $values[3]=11; break; case 'December': $values[3]=12; break; } } } $timestamp = mktime($values[0], $values[1], $values[2], $values[3], $values[4], $values[5]); } return $timestamp; } $time=parseDateByFormat('March 10, 2001, 5:16 pm', 'F j, Y, g:i a'); echo date('d.m.Y H:i:s',$time);
|
'F' war in der Schleife nicht abgearbeitet. Gilt auch für andere.
Das mit der switch case kann man mit den Array auch etwas "hübscher" lösen.
Gruß
Shockshell
__________________
Nichts hält so lange wie ein Provisorium....
|
05.02.10, 21:09
|
#14 (permalink)
|
|
Tutorials.de Gastzugang
|
AW: Beliebiges Datum per Format in Timestamp umwandeln
Ah ok. Ist mir nicht aufgefallen, dass in der Schleife was fehlt. Danke. Ich teste es morgen mal mit "hübscherem" Array. 
|
06.02.10, 09:42
|
#15 (permalink)
|
|
Tutorials.de Gastzugang
|
AW: Beliebiges Datum per Format in Timestamp umwandeln
Hallo shockshell,
es funktioniert hervorragend. Danke.
Ich habe auch AM|PM abgefangen. Aber ich weiß nicht, wie ich die noch fehlenden Elemente in der Schleife verarbeiten kann.
Kannst du mir noch einmal helfen?
|
|