Beliebiges Datum per Format in Timestamp umwandeln

shockshell

Erfahrenes Mitglied
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
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
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
 
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.
 
Zuletzt bearbeitet:
PHP:
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'));
 
Super! Passt (fast)
Musst beim kleinen d noch eine null am Anfang einfügen
PHP:
(?P<d>[1-9]|[12][0-9]|3[01])  => (?P<d>0[1-9]|[12][0-9]|3[01])
Danke.
 
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?
 
Zurück