Konvertieren einer Zeichenfolge in Date und DateTime

292

Wenn ich eine PHP-Zeichenfolge im Format mm-dd-YYYY(z. B. 16.10.2003) habe, wie konvertiere ich diese ordnungsgemäß in a Dateund dann in a DateTimeim Format YYYY-mm-dd? Der einzige Grund, warum ich nach beidem frage Dateund DateTimeist, ist, dass ich einen an einem Ort und den anderen an einem anderen Ort brauche.

Chris Pinski
quelle

Antworten:

480

Verwenden strtotime()Sie es dann bei Ihrem ersten Date 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 es einen Unterschied zwischen der Verwendung von Schrägstrich /und Bindestrich -in der strtotime()Funktion gibt. Um aus php.net zu zitieren:

Daten in den Formaten m / d / y oder dmy werden durch Betrachten des Trennzeichens zwischen den verschiedenen Komponenten eindeutig: Wenn das Trennzeichen ein Schrägstrich (/) ist, wird das amerikanische m / d / y angenommen; Wenn das Trennzeichen ein Bindestrich (-) oder ein Punkt (.) ist, wird das europäische dmy-Format angenommen.

Um mögliche Unklarheiten zu vermeiden, verwenden Sie nach Möglichkeit ISO 8601-Daten (JJJJ-MM-TT) oder DateTime :: createFromFormat ().

Ibu
quelle
11
Das wird nicht funktionieren. PHP interpretiert diese Eingabe als TT-MM-JJJJ.
Matthew
Ich habe meinem Code ein wenig mehr Erklärung hinzugefügt, danke @konforce
Ibu
9
Lesen Sie die nächste Antwort für eine bessere Lösung
Manuel Bitto
@delive Ihre Datumszeichenfolge ist höchstwahrscheinlich kein korrektes Datum.
Ibu
8
Es funktioniert nicht, weil diese Antwort irreführend ist. strtotimeakzeptiert bestimmte Formate. Sie können es überhaupt nicht füttern. Deshalb DateTime::createFromFormatsollte statt verwendet werden strtotime. Leider hat diese Antwort zu viele positive Stimmen, als dass jemand darauf achten könnte. Heutzutage ist alles Kopieren und Einfügen.
NB
432

Sie müssen mit den Formaten m / d / Y und mdY vorsichtig sein. PHP /bedeutet m / d / Y und -dmY. 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 den Launen einer bestimmten Interpretation ausgeliefert.

Matthew
quelle
37
Neugierig, warum dies nicht die akzeptierte Antwort ist ... Dies ist viel flexibler, als sich auf die Macken der strtotime()Funktion zu verlassen.
jzimmerman2011
9
Es ist wichtig darauf hinzuweisen, dass die PHP DateTime- Klasse seit PHP Version 5.2 und createFromFormat seit 5.3 verfügbar ist
Diego Nemo
14
Wie bei jeder Funktion sollten Sie prüfen, ob sie die Mindestversion erfüllt, die Sie unterstützen müssen. Aber PHP 5.2 EOL war Januar 2011. Niemand sollte es mehr ausführen; Die Versorgung dieser Menschen ermöglicht es ihnen lediglich, veraltete, unsichere Software auszuführen.
Matthew
@ Matthew ja, richtig. Aber Sie nie jetzt, auch heute noch fand ich eine PHP4.1-Version noch installiert ...
Roland
29

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, da dies abstürzen wird mit:

PHP Fatal error: Call to a member function format() on a non-object 

Sie müssen zunächst überprüfen, ob die Formatierung einwandfrei funktioniert hat:

$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 jetzt abzustürzen, erhalten Sie eine Ausnahme, die Sie abfangen, verbreiten usw. können.

$ dateDE hat das falsche Format, es sollte "16.10.2013" sein;

user2707671
quelle
Beachten Sie, dass das Überprüfen von $ dateObj auf diese Weise nur sicherstellen würde, dass das Format mit der Maske übereinstimmt, nicht dass das Datum tatsächlich gültig ist. Zum Beispiel würde ein Datum wie 99/99/2010 diese Prüfung bestehen, da es mit m / d / Y übereinstimmt, aber es ist kein Datum, das Sie normalerweise zulassen möchten. Diese Antwort adressiert diese Situation -> stackoverflow.com/a/10120725/995014
Kilian Perdomo Curbelo
22
$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 für die Standard-Zeitzone des Servers.

NB
quelle
6
Ich glaube, dies wird eine Ausnahme auslösen, da der 16. Monat ungültig ist.
Matthew
Es ist wichtig darauf hinzuweisen, dass die PHP DateTime- Klasse seit PHP Version 5.2 und getTimestamp seit 5.3 verfügbar ist
Diego Nemo
2

Für das erste Date

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

Für neues Datum

$_newDate = date("Y-m-d",strtotime($_yourDateString));
Vi8L
quelle
2

Wenn Sie das Format TT-MM-JJJJ haben, funktioniert es in PHP nicht wie erwartet. Im PHP-Dokument haben sie unten Richtlinien.

Daten in den Formaten m / d / y oder dmy werden durch Betrachten des Trennzeichens zwischen den verschiedenen Komponenten eindeutig: Wenn das Trennzeichen ein Schrägstrich (/) ist, wird das amerikanische m / d / y angenommen; Wenn das Trennzeichen ein Bindestrich (-) oder ein Punkt (.) ist, wird das europäische dmy-Format angenommen.

Sie können also einfach nicht verwenden, wie Sie möchten. Wenn Sie versuchen, das Format TT / MM / JJJJ zu verwenden, wird FALSE entfernt. Sie können Folgendes optimieren.

$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
  $timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
MAULIK MODI
quelle
1

Als hätten wir das Datum "07 / Mai / 2018" und wir brauchen das 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 :)

Newton Singh
quelle
0

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");

Sodj
quelle
0

Wenn Sie Datumsangaben in amerikanischer Reihenfolge (Monat, Datum, Jahr) für europäische Formate (mit Bindestrich oder Punkt als Tag, Monat, Jahr) akzeptieren möchten, während Sie andere Formate akzeptieren , können Sie 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 mdY zu akzeptieren und Ymd 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'); ?>
Tim Morton
quelle
0


Um ein Datum aus einer beliebigen Zeichenfolge zu erstellen, verwenden Sie: $ date = DateTime :: createFromFormat ('dmy H: i', '01 -01-01 01:00 '); echo $ date-> format ('Ymd H: i');

Azouz Mohamadi
quelle