Конвертировать из даты и времени MySQL в другой формат с помощью PHP

448

У меня есть datetimeколонка в MySQL.

Как я могу преобразовать его в дисплей в формате мм / дд / гг Ч: М (AM / PM) с помощью PHP?

Тим Боланд
источник
4
Нам нужно знать, как дата хранится в SQL. Это метка времени или дата-время или unixtime?
Олафур Вааге
Они хранятся не во время Unix, как обычная дата, PHP - это то, что обрабатывается как секунды и прочее. Я бы порекомендовал вам использовать функции PHP OOPdatetime, они очень просты в использовании.
Гучо Са
2
Могу ли я порекомендовать и альтернативу вашему формату даты? mm/dd/yyочень американец, и те из нас, кто живет в других частях света, становятся более чем раздражительными, пытаясь угадать, что имеется в виду 11-12-13. Более универсальный стандарт является yyyy-mm-ddи является частью стандарта ISO 8601. В противном случае вы должны использовать название месяца , а не номер.
Мэнго

Ответы:

515

Если вы ищете способ нормализовать дату в формате MySQL, используйте следующее

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

Строка $phpdate = strtotime( $mysqldate )принимает строку и выполняет серию эвристик, чтобы превратить эту строку в метку времени Unix.

Строка $mysqldate = date( 'Y-m-d H:i:s', $phpdate )использует эту метку времени и dateфункцию PHP, чтобы превратить эту метку обратно в стандартный формат даты MySQL.

( Примечание редактора : этот ответ приведен здесь из-за оригинального вопроса с непонятной формулировкой и общей полезности Google, предоставленной этим ответом, даже если он не 'прямо ответил на вопрос, который существует в настоящее время)

КТА
источник
19
этот ответ сбивает с толку тему
Alex K
5
@ 0xBAADF00D: пожалуйста, прочитайте вопрос еще раз ... никто не спрашивал о стандартном формате MySQL.
user7116
3
конечно, но, когда стандарт существует, было бы неплохо следовать стандарту (это позволит избежать головной боли позже, когда другой разработчик поработает над вашим кодом) xD
0xBAADF00D
4
Вопрос просит выводить в формате мм / дд / гг ч: м (AM / PM), а не «Гмд ч: i: s».
Рикки
6
does not workдля кого? Принятый ответ будет работать, если вы хотите конвертировать из MySQL в mm / dd / yy H: M (AM / PM) в соответствии с запросом OP. То, что вы хотите сделать обратное, не делает принятый ответ неправильным.
Токсалот
311

Чтобы преобразовать дату, полученную из MySQL, в запрошенный формат ( mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Обратитесь к параметрам форматирования даты PHP, чтобы настроить формат.

Тим Боланд
источник
Откуда этот $rowобъект?
Майк
25
Я могу ошибаться, но я думаю, что некоторые из вас упускают суть. Он хочет, чтобы выходные данные были в формате «m / d / yg: i A», извлекая исходную дату из поля DATETIME. Так что его код работает. @Mike $ row-> createate - это просто столбец даты и времени Тима.
Mere Development
4
Ответ @AsTeR сбивает с толку, только если вы неправильно прочитали вопрос. ОП ответил на свой вопрос и хочет взять дату из MySQL и вывести в запрошенный формат: мм / дд / гг ч: М (AM / PM) .
Токсалот
@TimBoland Я думаю, что ответ мог бы быть улучшен, если бы был выделен из, а также запрошенный формат мм / дд / гг ч: M (AM / PM) . И это могло бы извлечь выгоду из ссылки на функцию даты. Я пытался предложить редактирование , но оно было отклонено.
Токсалот
1
Интересный факт: этот ответ примерно эквивалентен ответу чуть ниже (у которого практически нет отрицательных голосов), но он получил> 40 отрицательных голосов, потому что он отвечает на вопрос ОП, который отличается от того, который на самом деле имеют люди, которые приходят на эту страницу.
Климент
110

Если вы используете PHP 5, вы также можете попробовать

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");
enobrev
источник
Как указано выше в комментариях, стандартный формат("Y-m-d H:i:s")
Yannickv
45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Ссылка: http://php.net/manual/en/function.date.php

Тони Старк
источник
Я думаю, что люди понижают голос, потому что они смущены вопросом OP. Большинство читают вопрос, чтобы быть противоположностью того, что есть на самом деле. Другая возможность состоит в том, что это очень похоже на принятый ответ, который был опубликован 5+ лет назад.
Токсалот
1
Ссылка, на которую вы ссылаетесь, не указывает на функцию, которую вы используете, и не объясняет формат. Я думаю, что php.net/function.date.php будет лучше.
Токсалот
@toxalot Принятый ответ неверен. Это отредактировано после моего ответа и о моей ссылке я заменяю вашу ссылку. Спасибо
Тони Старк
1
Весь этот Q & A имеет грязную историю. Принятый ответ был неверным в период с 29 апреля 2013 года по 24 мая 2013 года. Он был правильным, когда вы впервые опубликовали свой ответ. Ваш ответ был неверным до 29 мая 2013 года, после чего он стал очень похож на принятый ответ.
Токсалот
24

Наконец, правильное решение для PHP 5.3 и выше: (добавлен необязательный часовой пояс к примеру, как упомянуто в комментариях)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');
Hasenpriester
источник
его ошибка .. Класс 'App \ Controller \ DateTime' не найден .. использующий php 6.4
aswzen
1
Если вы работаете в другом пространстве имен, вы должны назвать его с обратной косой чертой перед ним:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester
2
Не забудьте указать часовой пояс при создании объекта даты! В противном случае ваша отформатированная дата может занять несколько часов. Ваши datetimeстолбцы должны быть UTF8, поэтому передайте new DateTimeZone('UTC')в качестве третьего параметра, чтобы PHP знал.
Эрик Сеастранд
Это правильный ответ, который выводит желаемый формат OP, просто позаботьтесь о часовых поясах
Бухгалтер م
12

Более простым способом было бы отформатировать дату непосредственно в запросе MySQL вместо PHP. См. Запись в MySQL для DATE_FORMAT. .

Если вы предпочитаете делать это на PHP, тогда вам нужна функция date , но вам сначала нужно будет преобразовать значение вашей базы данных в метку времени.

вспышка
источник
11
-1 потому что форматирование даты в БД не очень хорошая идея. Мультиязычному вебу нужны разные форматы даты, а затем вам нужно отформатировать дату в PHP (общий язык бизнес-логики). Когда вы писали о dateфункции, то вы должны написать о strottimeфункции также, чтобы помочь кому-то вместо того, чтобы «но вам сначала нужно будет преобразовать значение вашей базы данных в метку времени».
Борис Шушка
10

Забыть все. Просто используйте:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))
nixis
источник
9

Чтобы правильно отформатировать DateTimeобъект в PHP для хранения в MySQL, используйте стандартизированный формат, который использует MySQL, то есть ISO 8601 .

В PHP этот формат хранится как константа начиная с версии 5.1.1, и я настоятельно рекомендую использовать его, а не каждый раз вводить строку вручную.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Это и список других констант PHP DateTime доступны по адресу http://php.net/manual/en/class.datetime.php#datetime.constants.types.

Greg
источник
MySQL фактически не использует этот формат, и MySQL генерирует предупреждение, если вы включаете указатель часового пояса "+ xxxx", который генерируется им. ОБНОВЛЕНИЕ X SET Y = '2014-03-31T15: 00: 00 + 0100' где Z; Запрос в порядке, затронуто 0 строк, 1 предупреждение (0,06 с) Соответствующие строки: 1 Изменено: 0 Предупреждения: 1
Джордж Лунд
ОП хочет взять дату из формата MySQL и преобразовать в мм / дд / гг ч: М (AM / PM) .
Токсалот
8

Это должно отформатировать поле в запросе SQL:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename
Риз
источник
Вы должны указать MySQL запрос, а не только SQL, потому что это не обязательно будет работать со всеми базами данных. Хотя OP попросил PHP-решение, это хорошая альтернатива, о которой OP может и не знать. Однако это не обеспечит запрашиваемый формат. Чтобы получить требуемый формат OP, вам нужно '%m/%d/%y %h:%i %p'.
Токсалот
7

Используйте функцию даты :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>
Густаво Каррено
источник
25
Разве функция date () не ожидает целую отметку времени, а не дату и время, указанные в вопросе?
Loftx
5

В зависимости от вашей конфигурации даты и времени MySQL. Обычно: 2011-12-31 07:55:13 формат. Эта очень простая функция должна творить чудеса:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Или немного больше, чтобы соответствовать вопросу.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}
TFont
источник
1
Это не отвечает на вопрос ОП. ОП хочет взять дату из формата MySQL и преобразовать в мм / дд / гг ч: М (AM / PM) . Плюс это будет просто форматировать текущее время, а не конкретную дату.
Токсалот
5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

Если вы не хотите изменять каждую функцию в вашем PHP-коде, чтобы показать ожидаемый формат даты, измените ее в источнике - вашей базе данных.

Важно , чтобы назвать строки с как оператором , как в приведенном выше примере (как dateFrom, так как dateUntil). Имена, которые вы пишете, есть имена, строки будут вызываться в вашем результате.

Выход этого примера будет

[День месяца, числовой (0..31)]. [Название месяца (январь .. декабрь)]. [Год, числовой, четыре цифры]

Пример: 5. августа 2015

Измените точки с выбранным разделителем и проверьте функцию DATE_FORMAT (дата, формат) для большего количества форматов даты.

Ранжел
источник
3

Вы также можете сделать так, чтобы ваш запрос возвращал время в виде метки времени Unix. Это избавило бы от необходимости вызывать strtotime()и сделать вещи немного менее интенсивными на стороне PHP ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Тогда в PHP просто используйте date()функцию, чтобы отформатировать ее так, как вам хочется.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

или

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

Мне нравится этот подход , в отличие от использования MySQL «ю.ш.DATE_FORMAT функции, так как она позволяет повторно использовать один и тот же запрос , чтобы захватить данные и позволяет изменять форматирование в PHP.

Досадно иметь два разных запроса только для того, чтобы изменить внешний вид даты в пользовательском интерфейсе.

phatduckk
источник
Мне нравится идея использования UNIX_TIMESTAMPдля устранения необходимости strtotime. Этот ответ был бы лучше, если бы он приводил пример форматирования времени в фактически запрошенном формате OP.
Токсалот
1

У вас могут быть проблемы с датами, которые не возвращаются в метке времени Unix, так что это работает для меня ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))
matt.j.crawford
источник
1
Это не преобразует дату в формат, запрошенный OP.
Токсалот
1

Это будет работать ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));
Михир Вадалиа
источник
1
Этот формат смешивается 24 раза с AM / PM. В остальном это тот же самый ответ, который был опубликован 5+ лет назад.
Токсалот
0

Используя PHP версии 4.4.9 и MySQL 5.0, это сработало для меня:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateэто столбец в MySQL .

Питер Мортенсен
источник
Это не преобразует дату в формат, запрошенный OP
toxalot
0

Подход, который я предлагаю, работает следующим образом. Во-первых, вы создаете базовый объект datetime из строки в формате mysql; а затем вы форматируете его так, как вам нравится. К счастью, mysql datetime соответствует ISO8601, поэтому сам код может выглядеть довольно просто и элегантно. Имейте в виду, что в этом datetimeстолбце нет информации о часовом поясе, поэтому вам необходимо соответствующим образом преобразовать ее .

Вот код:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Выводит 01/19/2038 11:14AM - надеюсь, что вы ожидаете.

В этом примере используется библиотека безе. Вы можете проверить еще немного, если хотите.

Вадим Самохин
источник
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
источник
1
Это не отвечает на вопрос ОП. ОП хочет взять дату из формата MySQL и преобразовать в мм / дд / гг ч: М (AM / PM) . Это делает наоборот. Кроме того, он принимает данные из формы, а не из базы данных.
toxalot