wake-up-neo.com

Konvertierung von String in Date und DateTime

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.

241
Chris Pinski

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.

397
Ibu

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.

373
Matthew

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;

24
user2707671
$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.

21
N.B.

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
1
MAULIK MODI

Zum ersten Datum

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

Für neues Datum

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

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 :)

0
Newton Singh

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

0
Sodj

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'); ?>
0
Tim Morton