Dacă am un PHP șir de caractere în format mm-dd-YYYY
(de exemplu, 10-16-2003), cum pot converti corect ca la o "Data" si apoi un "DateTime" în formatul YYYY-mm-dd
? Singurul motiv pentru care am cerut atât "Data" și "DateTime" este pentru că am nevoie într-un singur loc, iar celălalt într-un alt loc.
Folosesc strtotime()de la prima întâlnire, apoi, pentru data de('Y-m-d')
pentru a converti înapoi:
$time = strtotime('10/16/2003');
$newformat = date('Y-m-d',$time);
echo $newformat;
// 2003-10-16
Rețineți că există o diferență între utilizarea slash /
și cratimă -
la strtotime()
funcție. Pentru a cita din php.net:
Date în m/d/y sau d-meu formate sunt diferentiate uitandu-se la separator între diferitele componente: dacă separatorul este un slash (/), apoi American m/d/y este presupune; întrucât, dacă separatorul este un dash (-) sau un punct (.), apoi European d-meu format este presupus.
Ai nevoie să fie atent cu m/d/Y și m-d-Y formate. PHP consideră /
să spun m/d/Y și " - " să spui d-m-Y m-aș descrie în mod explicit în formatul de intrare în acest caz:
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
În acest fel nu sunt la cheremul o anumită interpretare.
Pentru a analiza în prezent, ar trebui să utilizați: DateTime::createFromFormat();
Ex:
$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");
Cu toate acestea, atenți, pentru că acest lucru se va prăbuși cu:
PHP Fatal error: Call to a member function format() on a non-object
De fapt, aveți nevoie pentru a verifica faptul că formatare a mers bine, în primul rând:
$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");
Acum, în loc de crashing, veți obține o excepție, pe care le poate prinde, propaga, etc.
$dateDE a format greșit, ar trebui să fie "16.10.2013";
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
Edit: de asemenea, puteți trece un DateTimeZone să DateTime() constructor pentru a asigura crearea de data dorită de fus orar, nu serverul implicit.
Dacă aveți în format zz-ll-aaaa apoi în PHP nu va't lucreze cum era de așteptat. În PHP document au mai jos orientare.
Date în m/d/y sau d-meu formate sunt diferentiate uitandu-se la separator între diferitele componente: dacă separatorul este un slash (/), apoi American m/d/y este presupus; întrucât, dacă separator este o liniuță (-) sau un punct (.), atunci Europene, d-mi format este de presupus.
Deci, nu se poate't folosi cum doriți. Atunci când încercați să utilizați dd/mm/yyyy cu acest lucru, atunci se va elimina FALSE. Puteți tweak cu următoarele.
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
Ca trebuie data "07/Mai/2018" și avem nevoie de data "2018-05-07" ca mysql compatibil
if (!empty($date)) {
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
$date = date('Y-m-d', $timestamp);
}
Acesta funcționează pentru mine. bucurați-vă de :)
Dacă doriți pentru a accepta date folosind American de comanda (lună, zi, an) pentru stil European formate (folosind dash sau perioada de după zi, lună, an) în timp ce încă accepta alte formate, puteți extinde clasa DateTime:
/**
* 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'
Sau, puteți face o funcție pentru a accepta m-d-Y și de ieșire Y-m-d:
/**
* 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'); ?>