Tekenreeks converteren naar Date en DateTime

Als ik een PHP-string heb in het formaat mm-dd-YYYY(bijvoorbeeld 16-10-2003), hoe converteer ik die dan op de juiste manier naar een Dateen vervolgens een DateTimein het formaat YYYY-mm-dd? De enige reden waarom ik zowel Dateals DateTimevraag, is omdat ik er een op de ene plek nodig heb en de andere op een andere plek.


Antwoord 1, autoriteit 100%

Gebruik strtotime()op je eerste date en vervolgens date('Y-m-d')om het terug te converteren:

$time = strtotime('10/16/2003');
$newformat = date('Y-m-d',$time);
echo $newformat;
// 2003-10-16

Houd er rekening mee dat er een verschil is tussen het gebruik van slash /en koppelteken -in de strtotime()functie. Om te citeren van php.net:

Datums in de notatie m/d/y of d-m-y
worden ondubbelzinnig gemaakt door te kijken naar de
scheidingsteken tussen de verschillende
componenten: als het scheidingsteken een . is
schuine streep (/), dan is de Amerikaanse m/d/y
verondersteld; terwijl als het scheidingsteken a . is
streepje (-) of een punt (.), dan de
Er wordt uitgegaan van Europees d-m-y-formaat.

Om mogelijke dubbelzinnigheid te voorkomen, is het het beste om indien mogelijk ISO 8601 (JJJJ-MM-DD) datums of DateTime::createFromFormat() te gebruiken.


Antwoord 2, autoriteit 89%

Je moet voorzichtig zijn met m/d/Y- en m-d-Y-formaten. PHP beschouwt /als m/d/Y en -als d-m-Y. Ik zou in dit geval expliciet het invoerformaat beschrijven:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

Op die manier zit je niet aan de grillen van een bepaalde interpretatie.


Antwoord 3, autoriteit 6%

Om de datum te ontleden, moet u het volgende gebruiken:
DateTime::createFromFormat();

Bijvoorbeeld:

$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

Voorzichtig, want dit loopt vast met:

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

Je moet eerst controleren of het formatteren goed is gegaan:

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

In plaats van te crashen, krijg je nu een uitzondering die je kunt opvangen, verspreiden, enz.

$dateDE heeft het verkeerde formaat, het zou “16.10.2013” moeten zijn;


Antwoord 4, autoriteit 4%

$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

Bewerken: u kunt ook een DateTimeZone doorgeven aan DateTime()-constructor om ervoor te zorgen dat de datum voor de gewenste tijdzone wordt gemaakt, niet de standaardserver.


Antwoord 5, autoriteit 2%

Omdat niemand dit heeft genoemd, is dit een andere manier:

$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");

Antwoord 6

Om een datum te maken van een willekeurige tekenreeks die u kunt gebruiken:

$date = DateTime::createFromFormat('d-m-y H:i', '01-01-01 01:00');
echo $date->format('Y-m-d H:i');

Antwoord 7

Als je het formaat dd-mm-jjjj hebt, zal het in PHP niet werken zoals verwacht. In PHP-document hebben ze onderstaande richtlijn.

Datums in de notatie m/d/y of d-m-y worden ondubbelzinnig gemaakt door te kijken naar
de separator tussen de verschillende componenten: als de separator a . is
schuine streep (/), dan wordt uitgegaan van de Amerikaanse m/d/y; overwegende dat als de
scheidingsteken is een streepje (-) of een punt (.), dan is het Europese d-m-y-formaat
wordt verondersteld.

Dus je kunt het gewoon niet gebruiken zoals je wilt. Wanneer u hiermee het dd/mm/jjjj-formaat probeert te gebruiken, zal het FALSE verwijderen. Je kunt het volgende aanpassen.

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

Antwoord 8

Voor de eerste date

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

Voor nieuwe datum

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

Antwoord 9

Als je de datum hebt geformatteerd als “07/mei/2018” en je moet het in “2018-05-07” maken zodat het MySQL-compatibel is, kun je het volgende gebruiken:

if (!empty($date)) {
  $timestamp = strtotime($date);
  if ($timestamp === FALSE) {
    $timestamp = strtotime(str_replace('/', '-', $date));
  }
  $date = date('Y-m-d', $timestamp);
}

Antwoord 10

Als u datums wilt accepteren met Amerikaanse volgorde (maand, datum, jaar) voor indelingen in Europese stijl (met een streepje of punt als dag, maand, jaar) terwijl u nog steeds andere indelingen accepteert, je kunt de DateTime-klasse uitbreiden:

/**
 * 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'

Of je kunt een functie maken om m-d-Y te accepteren en Y-m-d uit te voeren:

/**
 * 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'); ?>

Antwoord 11

Als u de laatste dag van de huidige maand wilt krijgen, kunt u het doen met de volgende code.

$last_day_this_month  = date('F jS Y', strtotime(date('F t Y')));

Antwoord 12

Ik probeer alle bovenstaande antwoorden, maar faalt voor mij waar ik in mijn geval een functie heb gebouwd die de datumstring krijgt met het volgende formaat ‘JJJJ / MM / DD’. Dus ik denk veel beter om de reeks zo te ontploffen:

$old_date = explode('/', $coming_date_str);

$new_data = $old_date[0].'-'.$old_date[1].'-'.$old_date[2];// dit om de tekenreeks te converteren als al het bovenstaande Posts en compleet

$new_date = date('Y-m-d', strtotime($new_data));
$new_date = DateTime::createFromFormat("Y-m-d", new_date);

Other episodes