2016-12-28 3 views
4

У меня есть таблица DB DB с столбцом с именем "timestamp", тип timestamp и атрибут on update CURRENT_TIMESTAMP и значение по умолчанию CURRENT_TIMESTAMP.Как преобразовать MySQL TIMESTAMP в дату времени в PHP

Если я добавлю запись в таблицу, указав другие значения, но не временную метку, то метка времени автоматически добавляется как 2016-12-28 17:02:26.

В PHP я запросить таблицу с помощью следующего запроса

SELECT * FROM history WHERE user_id = 9 ORDER BY timestamp ASC 

Результат запроса сохраняется в $rows и я использую foreach, чтобы создать массив с некоторыми из других значений, отформатированные. Я пытаюсь отформатировать временную метку на дату 24-часовой даты в Великобритании: dd/mm/yy, HH:MM:SS.

Я попробовал оба date() и strftime() функции следующим образом:

$formatted_datetime = strftime("%d %m %y %H %M %S", $row["timestamp"]); 
$formatted_datetime = date("d/m/y, H:i:s", $row["timestamp"]); 

Оба эти результата в следующем уведомлении и дата время выводимого некорректно, как 01 01 70 00 33 36:

Примечание: A неверно сформированное числовое значение, встречающееся в /home/ubuntu/workspace/pset7/public/history.php в строке 20

Я новичок в PHP и MySQL, и до сих пор ни один из других вопросов или документации, которые я видел, не успешно справился с выполнением этого преобразования. Я не понимаю, почему strftime() не работает, и как это сделать правильно?

+0

Возможный дубликат [Преобразование MySQL временной метки в фактическую дату и время?] (Http://stackoverflow.com/questions/5547252/convert-mysql-timestamp-into-actual-date-and- время) – Tiger

+1

Sidenote: я бы не использовал 'TIMESTAMP' из-за его ограничений: *« Тип данных TIMESTAMP используется для значений, содержащих как дату, так и время. TIMESTAMP имеет диапазон «1970-01-01 00:00» : 01 'UTC to **' 2038-01-19 03:14:07 '** UTC. * * Https://dev.mysql.com/doc/refman/5.5/en/datetime.html использовать 'DATETIME' * «Тип DATETIME используется для значений, содержащих как дату, так и время. MySQL извлекает и отображает значения DATETIME в формате« YYYY-MM-DD HH: MM: SS ». Поддерживаемый диапазон:« 1000-01-01 00: 00:00 'до **' 9999-12-31 23:59:59 '. ** "* –

+0

@Tiger Выбранное решение там похоже ... как много. Получил ли я другой тип для столбца timestamp на моем столе? – Toby

ответ

4

Для этого ОО (и наиболее гибких) способа использования DateTime класса и использовать статический createFromFormat метод для создания экземпляра нового DateTime объекта:

$new_datetime = DateTime::createFromFormat ("Y-m-d H:i:s", $row["timestamp"]); 

Теперь вы можете использовать $new_datetime объекта для создания какого-либо строковое представления вы хотите, вызвав format метод объекта:

echo $new_datetime->format('d/m/y, H:i:s'); 

Чтобы загрузить, вы, так как у вас есть объект DateTime, вы можете теперь и любым способом преобразования (например, смещение часовых поясов или добавление дней), сравнение (больше или меньше другого DateTime) и различные расчеты времени (сколько дней/месяцев/etc ... между этим и другим DateTime).

Дата Время: http://php.net/manual/en/class.datetime.php Узнать об этом. Любить это. Переживи это.

1

Обычно в MySQL дата timestamp экономит время, так как YYYY-MM-DD HH:MM:SS (2016-12-20 18:36:14) formate вы можете легко преобразовать их по своему желанию с помощью формы даты, но сначала вам нужно будет преобразовать свой ввод вовремя. После будет делать трюк

$formatted_datetime = date("d/m/y, H:i:s", strtotime($row["timestamp"])); 
+0

Не знаете, почему это было опущено, в то время как это может быть не OO-путь, strtotime будет работать нормально для временных меток MySQL. – Devon

0

Я бы использовать Carbon class и его Строка форматирования

$carbon = Carbon::instance('2016-12-28 17:02:26'); 

Затем вы можете отформатировать его так, как вы хотите.

+2

Важно отметить, что Carbon является сторонним расширением PHP API DateTime. – Devon

+0

@Devon Правда, но очень полезно. Это так хорошо, что он поставляется с Laravel – Samuel

+0

Да, я использую его почти каждый день. Не уверен, почему это было занижено, Carbon - отличное решение для тех, кто хочет использовать библиотеку. +1 для восстановления баланса. – Devon

1

Почему бы не заставить MySQL выполнять работу? И вы действительно хотите mm/dd/yy, а не dd/mm/yy?

SELECT *, DATE_FORMAT(timestamp, '%m/%d/%y, %T') formatted_date FROM .... 

Затем вы можете извлечь форматированную дату как $ row ['formatted_date'].

См https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

+0

Упс, вы правы, я хочу dd/mm/yy, спасибо. Я отредактирую fothwith! – Toby

+0

У меня было имя DATE_FORMAT(), но только в отношении 'SELECT DATE_FORMAT ...' и не было уверенно, как его адаптировать, я дам ему попробовать – Toby

+0

Это работает, и мне нравится его аккуратность, но я думаю, что метод объекта Ray DateTime немного более гибкий. – Toby

Смежные вопросы