Wenn ich eine PHP - Zeichenfolge im Format von mm-dd-YYYY
habe (zum Beispiel 10-16-2003), wie kann ich diese dann korrekt in eine Date
und dann eine DateTime
im Format von YYYY-mm-dd
konvertieren? Der einzige Grund, warum ich sowohl für Date
als auch für DateTime
frage, besteht darin, dass ich eine an einer Stelle und die andere an einer anderen Stelle brauche.
Verwenden Sie strtotime()
an Ihrem ersten Datum und dann date('Y-m-d')
, um es zurück zu konvertieren:
$time = strtotime('10/16/2003');
$newformat = date('Y-m-d',$time);
echo $newformat;
// 2003-10-16
Beachten Sie, dass zwischen der Verwendung des Schrägstrichs /
und des Bindestrichs -
in der Funktion strtotime()
ein Unterschied besteht. Um aus php.net zu zitieren:
Datumsangaben in den Formaten m/d/y oder d-m-y sind durch das Betrachten der .__ eindeutig. Trennzeichen zwischen den verschiedenen Komponenten: wenn das Trennzeichen ein .__ ist. Schrägstrich (/), dann ist das amerikanische m/d/y angenommen; Wenn das Trennzeichen jedoch ein .__ ist. Bindestrich (-) oder ein Punkt (.), dann der Es wird ein europäisches d-m-y-Format angenommen.
Bei den Formaten m/d/Y und m-d-Y ist Vorsicht geboten. PHP betrachtet /
als m/d/Y und -
als d-m-Y. Ich würde das Eingabeformat in diesem Fall explizit beschreiben:
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
Auf diese Weise sind Sie nicht an den Launen einer bestimmten Interpretation interessiert.
Um das Datum zu analysieren, sollten Sie Folgendes verwenden: DateTime :: createFromFormat ();
Ex:
$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");
Seien Sie jedoch vorsichtig, denn dies stürzt ab mit:
PHP Fatal error: Call to a member function format() on a non-object
Sie müssen zunächst prüfen, ob die Formatierung einwandfrei gelaufen ist:
$dateDE = "16/10/2013";
$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);
if (!$dateObj)
{
throw new \UnexpectedValueException("Could not parse the date: $date");
}
$dateUS = $dateObj->format("m/d/Y");
Anstatt abzustürzen, erhalten Sie jetzt eine Ausnahme, die Sie fangen, verbreiten usw.
$ dateDE hat das falsche Format, es sollte "16.10.2013" sein;
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
Bearbeiten: Sie können auch eine DateTimeZone an den DateTime () - Konstruktor übergeben, um sicherzustellen, dass das Datum für die gewünschte Zeitzone erstellt wird, nicht die Standardeinstellung des Servers.
Wenn Sie das Format TT-MM-JJJJ haben, funktioniert es in PHP nicht wie erwartet. Im PHP -Dokument haben sie unterhalb der Richtlinie.
Datumsangaben in den Formaten m/d/y oder d-m-y werden durch die Betrachtung von .__ unbestimmt. das Trennzeichen zwischen den verschiedenen Komponenten: Wenn das Trennzeichen ein .__ ist. Schrägstrich (/), dann wird das amerikanische m/d/y angenommen; wohingegen der Trennzeichen ist ein Bindestrich (-) oder ein Punkt (.), dann das europäische Format d-m-y wird angenommen.
Sie können also nicht beliebig verwenden. Wenn Sie versuchen, das Format tt/mm/jjjj damit zu verwenden, wird FALSE entfernt. Sie können mit den folgenden Einstellungen optimieren.
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
Zum ersten Datum
$_firstDate = date("m-d-Y", strtotime($_yourDateString));
Für neues Datum
$_newDate = date("Y-m-d",strtotime($_yourDateString));
Wie wir haben Datum "07/Mai/2018" und wir brauchen Datum "2018-05-07" als Mysql-kompatibel
if (!empty($date)) {
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
$date = date('Y-m-d', $timestamp);
}
Für mich geht das. genießen :)
Da dies niemand erwähnte, ist hier ein anderer Weg:
$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");
Wenn Sie Datumsangaben in amerikanischer Reihenfolge (Monat, Datum, Jahr) für europäische Formate akzeptieren möchten (mit Bindestrich oder Punkt als Tag, Monat, Jahr) , während andere Formate weiterhin akzeptiert werden , Sie können die DateTime-Klasse erweitern:
/**
* Quietly convert European format to American format
*
* Accepts m-d-Y, m-d-y, m.d.Y, m.d.y, Y-m-d, Y.m.d
* as well as all other built-in formats
*
*/
class CustomDateTime extends DateTime
{
public function __construct(string $time="now", DateTimeZone $timezone = null)
{
// convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y (substr avoids microtime error)
$time = str_replace(['-','.'], '/', substr($time, 0, 10)) . substr($time, 10 );
parent::__construct($time, $timezone);
}
}
// usage:
$date = new CustomDateTime('7-24-2019');
print $date->format('Y-m-d');
// => '2019-07-24'
Oder Sie können eine Funktion erstellen, um m-d-Y zu akzeptieren und Y-m-d auszugeben:
/**
* Accept dates in various m, d, y formats and return as Y-m-d
*
* Changes PHP's default behaviour for dates with dashes or dots.
* Accepts:
* m-d-y, m-d-Y, Y-m-d,
* m.d.y, m.d.Y, Y.m.d,
* m/d/y, m/d/Y, Y/m/d,
* ... and all other formats natively supported
*
* Unsupported formats or invalid dates will generate an Exception
*
* @see https://www.php.net/manual/en/datetime.formats.date.php PHP formats supported
* @param string $d various representations of date
* @return string Y-m-d or '----' for null or blank
*/
function asYmd($d) {
if(is_null($d) || $d=='') { return '----'; }
// convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y
$d = str_replace(['-','.'], '/', $d);
return (new DateTime($d))->format('Y-m-d');
}
// usage:
<?= asYmd('7-24-2019') ?>
// or
<?php echo asYmd('7-24-2019'); ?>