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 Date
en vervolgens een DateTime
in het formaat YYYY-mm-dd
? De enige reden waarom ik zowel Date
als DateTime
vraag, 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);