Если у меня есть строка PHP в формате mm-dd-YYYY
(например, 10-16-2003), как правильно преобразовать ее в Date
, а затем a DateTime
в формате YYYY-mm-dd
? Единственная причина, по которой я запрашиваю как Date
, так и DateTime
, - это то, что мне нужно одно в одном месте, а другое - в другом месте.
Преобразование строки в Date и DateTime
Ответ 1
Используйте strtotime()
в вашей первой дате, затем date('Y-m-d')
, чтобы преобразовать его:
$time = strtotime('10/16/2003');
$newformat = date('Y-m-d',$time);
echo $newformat;
// 2003-10-16
Обратите внимание, что существует разница между использованием косой черты /
и дефиса -
в strtotime()
. Процитировать с php.net:
Даты в форматах m/d/y или d-m-y неоднозначно, глядя на разделитель между различными компоненты: если разделитель является slash (/), то американский m/d/y является предполагается; тогда как если разделитель является тире (-) или точке (.), то Предполагается, что европейский формат d-m-y.
Ответ 2
Вам нужно быть осторожным с форматами m/d/Y и m-d-Y. PHP считает, что /
означает m/d/Y и -
означает d-m-Y. Я бы в явном виде описал формат ввода в этом случае:
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
Таким образом, вы не находитесь в капризе определенной интерпретации.
Ответ 3
Чтобы разобрать дату, вы должны использовать: DateTime :: createFromFormat();
Пример:
$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");
Однако, будьте осторожны, потому что это приведет к сбою:
PHP Fatal error: Call to a member function format() on a non-object
Сначала вам нужно проверить, что форматирование прошло нормально:
$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");
Теперь вместо сбоя вы получите исключение, которое вы можете перехватить, распространить и т.д.
$ dateDE имеет неправильный формат, он должен быть "16.10.2013";
Ответ 4
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
Изменить: вы также можете передать конструктор DateTimeZone в DateTime(), чтобы обеспечить создание даты для требуемого часового пояса, а не для сервера по умолчанию.
Ответ 5
Если вы используете PHP 5.2 или high, используйте DateTime, как указано выше. Эта статья поможет.
Ответ 6
Если у вас есть формат dd-mm-yyyy, то в PHP он не будет работать должным образом. В документе PHP они имеют нижеследующее руководство.
Даты в форматах m/d/y или dmy устраняются, если посмотреть на разделитель между различными компонентами: если разделитель является косой чертой (/), то предполагается, что используется американский m/d/y; тогда как, если разделителем является тире (-) или точка (.), то подразумевается европейский формат dmy.
Таким образом, вы просто не можете использовать, как вы хотите. Когда вы попытаетесь использовать с этим формат дд/мм/гггг, он удалит ЛОЖЬ. Вы можете настроить следующее.
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
Ответ 7
Для первого свидания
$_firstDate = date("m-d-Y", strtotime($_yourDateString));
На новую дату
$_newDate = date("Y-m-d",strtotime($_yourDateString));
Ответ 8
Как у нас есть дата "07/May/2018" и нам нужна дата "2018-05-07" как mysql совместимый
if (!empty($date)) {
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
$date = date('Y-m-d', $timestamp);
}
Меня устраивает. наслаждаться :)
Ответ 9
Поскольку никто не упомянул об этом, вот еще один способ:
$date = date_create_from_format("mdY", "10-16-2003")->format("Ymd");
Ответ 10
Если вы хотите принять даты, используя американский порядок (месяц, дата, год) для европейских стилей (используя тире или точку в качестве дня, месяца, года) , при этом принимая другие форматы, вы можете расширить класс 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'
Или вы можете сделать функцию для приема m-d-Y и вывода Y-m-d:
/**
* Accept dates in various m, d, y formats and return as Y-m-d
*
* Changes PHP 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'); ?>