Преобразование строки в Date и DateTime

237

Если у меня есть строка PHP в формате mm-dd-YYYY (например, 10-16-2003), как правильно преобразовать ее в Date, а затем a DateTime в формате YYYY-mm-dd? Единственная причина, по которой я запрашиваю как Date, так и DateTime, - это то, что мне нужно одно в одном месте, а другое - в другом месте.

Теги:
string
datetime
date

8 ответов

369
Лучший ответ

Используйте 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.

  • 10
    Это не сработает. PHP будет интерпретировать этот ввод как DD-MM-YYYY.
  • 0
    я добавил немного больше объяснений в мой код, спасибо @konforce
Показать ещё 6 комментариев
348

Вам нужно быть осторожным с форматами 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');

Таким образом, вы не находитесь в капризе определенной интерпретации.

  • 33
    Любопытно, почему это не принятый ответ ... Это гораздо более гибко, чем полагаться на причуды функции strtotime() .
  • 9
    Важно отметить, что класс php DateTime доступен начиная с версии PHP 5.2 и createFromFormat начиная с версии 5.3.
Показать ещё 2 комментария
21

Чтобы проанализировать дату, вы должны использовать:   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";

  • 0
    Обратите внимание на то, что проверка $ dateObj таким образом только гарантирует, что формат соответствует маске, а не что дата действительно действительна. Например, такая дата, как 99/99/2010, прошла бы эту проверку, поскольку она соответствует m / d / Y, но это не та дата, которую вы обычно хотите разрешить. Этот ответ решает эту ситуацию -> stackoverflow.com/a/10120725/995014
20
$d = new DateTime('10-16-2003');

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

Изменить: вы также можете передать конструктор DateTimeZone в DateTime(), чтобы обеспечить создание даты для требуемого часового пояса, а не для сервера по умолчанию.

  • 4
    Я считаю, что это вызовет исключение, потому что 16-й месяц недействителен.
  • 0
    Важно отметить, что класс php DateTime доступен начиная с версии PHP 5.2 и getTimestamp начиная с версии 5.3
3

Если вы используете PHP 5.2 или high, используйте DateTime, как указано выше. Эта статья поможет.

1

Если у вас есть формат 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
1

Для первого свидания

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

На новую дату

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

Как у нас есть дата "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);
  }

Меня устраивает. наслаждаться :)

Сообщество Overcoder
Наверх
Меню