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

У меня есть столбец datetime в MySQL.

Как я могу преобразовать его в отображение как мм / дд / гг H: M (AM / PM) с помощью PHP?

Что нам нужно знать, так это то, как дата хранится в SQL. Это Timestamp, Datetime или unixtime?

Ólafur Waage 26.09.2008 03:15

Они хранятся не во времени unix, как и обычная дата, PHP - это тот, который обрабатывает их как секунды и прочее. Я бы порекомендовал вам использовать функции даты и времени PHP OOP, они очень просты в использовании.

Gucho Ca 15.01.2014 15:25

Могу ли я порекомендовать и альтернативу вашему формату даты? mm/dd/yy очень американский, и те из нас, кто живет в других частях мира, становятся более чем немного раздраженными, пытаясь перебрать, что имеется в виду под 11-12-13. Более универсальным стандартом является yyyy-mm-dd, который является частью стандарта ISO 8601. В противном случае вы должны использовать месяц имя, а не число.

Manngo 23.04.2017 08:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
456
3
743 556
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Более простой способ - отформатировать дату непосредственно в запросе MySQL, а не в PHP. См. Ручной ввод MySQL для DATE_FORMAT.

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

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

Boris Šuška 16.04.2013 02:23

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

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>

Разве функция date () не ожидает целочисленной метки времени, а не даты и времени, указанной в вопросе?

Loftx 06.04.2010 14:55

Чтобы преобразовать дату, полученную из 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?

Mike 02.03.2013 01:02

Я могу ошибаться, но я думаю, что некоторые из вас упускают из виду суть. Он хочет, чтобы результат был в формате «m / d / y g: i A», извлекая исходную дату из поля DATETIME. Итак, его код работает. @Mike $ row-> createdate - это просто столбец даты и времени Тима.

Mere Development 13.03.2013 18:48

Ответ @AsTeR сбивает с толку, только если вы неправильно прочитали вопрос. OP ответил на свой вопрос и хочет взять дату из MySQL и вывести в запрошенный формат: мм / дд / гг H: M (AM / PM).

toxalot 13.03.2014 05:45

@TimBoland Я думаю, что ответ можно было бы улучшить, если бы был подчеркнут из, а также запрошенный формат мм / дд / гг H: M (AM / PM). И ему может быть полезна ссылка на функцию даты. Я пытался предложить правку, но это было отклонено.

toxalot 13.03.2014 05:49

@toxalot и, конечно же, мы все трижды прочитали вопрос целиком, прежде чем перейти к копированию и вставке кода ответа;)

AsTeR 13.03.2014 12:27

Интересный факт: этот ответ примерно эквивалентен тому, который находится чуть ниже (который практически не имеет отрицательных голосов), но он получил более 40 отрицательных голосов, потому что он отвечает на вопрос OP, который отличается от того, который на самом деле есть у людей, которые приходят на эту страницу.

Clément 30.04.2014 02:53

Используйте это для вывода DateTime из MySql, например, в. веб-страница в ~ английском формате.

Vladimir Vukanac 21.11.2014 13:01

Вы также можете сделать так, чтобы ваш запрос возвращал время как временную метку 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);
?>

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

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

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

toxalot 13.03.2014 06:57

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

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

Как указано выше в комментариях, стандартный формат - ("Y-m-d H:i:s").

Yannickv 13.11.2014 13:31

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

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

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

Это не преобразует дату в формат, запрошенный OP

toxalot 13.03.2014 06:50

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

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))

Это не преобразует дату в формат, запрошенный OP.

toxalot 13.03.2014 06:29
Ответ принят как подходящий

Если вы ищете способ нормализовать дату в формате 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 ) использует эту временную метку и функцию PHP date, чтобы преобразовать эту временную метку обратно в стандартный формат даты MySQL.

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

этот ответ сбивает с толку тему

Alex K 06.06.2013 13:07

'Y-m-d H: i: s' - правильный стандартный формат даты и времени (прочтите руководство по MySQL, во всех примерах используется этот формат)

0xBAADF00D 08.08.2013 10:43

@ 0xBAADF00D: пожалуйста, прочтите вопрос еще раз ... никто не спрашивал о стандартном формате MySQL.

user7116 22.08.2013 19:11

конечно, но когда стандарт существует, было бы неплохо следовать стандарту (это позволит избежать головной боли позже, когда другой разработчик будет работать над вашим кодом) xD

0xBAADF00D 22.08.2013 21:27

Не могли бы вы сказать мне, каким будет preg_match для "m / d / y g: i: s"?

Hemi 07.09.2013 12:53

Вопрос просит выводить в формате мм / дд / гг H: M (AM / PM), а не «Y-m-d H: i: s».

Rikki 10.01.2014 21:01

does not work для кого? Принятый ответ будет работать, если вы хотите преобразовать из MySQL в мм / дд / гг H: M (AM / PM) в соответствии с запросом OP. Тот факт, что вы хотите сделать обратное, не делает принятый ответ неправильным.

toxalot 13.03.2014 06:22

Используйте это, чтобы преобразовать дату, вводимую пользователем на английском языке, чтобы сохранить как правильный MySQL.

Vladimir Vukanac 21.11.2014 13:00

Большое спасибо! Эта проблема беспокоила меня довольно долгое время. Так приятно видеть такой простой пример.

b0rgBart3 25.05.2020 19:40

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

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename

Вы должны указать запрос MySQL, а не только SQL, потому что это не обязательно будет работать со всеми базами данных. Хотя OP запросил решение PHP, это хорошая альтернатива, о которой OP, возможно, не знал. Однако это не обеспечит запрошенный формат. Чтобы получить запрашиваемый формат OP, вам понадобится '%m/%d/%y %h:%i %p'.

toxalot 13.03.2014 06:48

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

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))

$valid_date = date( 'm/d/y g:i A', strtotime($date));

Справка:http://php.net/manual/en/function.date.php

Я думаю, что люди голосуют против, потому что они не уверены в вопросе OP. Большинство считает вопрос противоположным тому, чем он является на самом деле. Другая возможность заключается в том, что это очень похоже на принятый ответ, который был опубликован 5+ лет назад.

toxalot 13.03.2014 05:19

Ссылка, на которую вы ссылаетесь, не указывает на используемую вами функцию и не объясняет формат. Думаю, лучше бы php.net/function.date.php.

toxalot 13.03.2014 06:04

@toxalot Принятый ответ неверен. Он отредактирован после моего ответа и по поводу моей ссылки я заменяю вашу ссылку. Спасибо

Tony Stark 01.04.2014 10:38

У всех этих вопросов и ответов грязная история. Принятый ответ был неверен между 29 апреля 2013 г. и 24 мая 2013 г. Он был правильным, когда вы впервые опубликовали свой ответ. Ваш ответ был неверен до 29 мая 2013 г., после чего он стал очень похож на принятый ответ.

toxalot 01.04.2014 21:08

Чтобы правильно отформатировать объект 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.

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

George Lund 13.01.2014 21:11

OP хочет взять дату в формате из MySQL и преобразовать кмм / дд / гг H: M (AM / PM).

toxalot 13.03.2014 06:13

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

Это не ответ на вопрос OP. OP хочет взять дату в формате из MySQL и преобразовать кмм / дд / гг H: M (AM / PM). Это наоборот. Кроме того, он принимает ввод из формы, а не из базы данных.

toxalot 13.03.2014 05:09

В зависимости от вашей конфигурации MySQL datetime. Обычно: формат 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));
}

Это не ответ на вопрос OP. OP хочет взять дату в формате из MySQL и преобразовать кмм / дд / гг H: M (AM / PM). Кроме того, это просто отформатирует текущее время, а не конкретную дату.

toxalot 13.03.2014 04:46

Это сработает ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));

В этом формате 24 часа смешиваются с AM / PM. В остальном это тот же ответ, что и принятый ответ, опубликованный более 5 лет назад.

toxalot 13.03.2014 06:09

Наконец, правильное решение для 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');

его ошибка .. Класс "App \ Controller \ DateTime" не найден .. с использованием php 6.4

aswzen 26.11.2017 14:49

Если вы работаете в другом пространстве имен, вы должны называть его с обратной косой чертой перед ним: \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);

Hasenpriester 05.12.2017 01:30

Не забудьте указать часовой пояс при создании объекта даты! В противном случае ваша отформатированная дата может быть на несколько часов позже. Ваши столбцы datetime должны быть в формате UTF8, поэтому передайте new DateTimeZone('UTC') в качестве третьего параметра, чтобы убедиться, что PHP знает.

Eric Seastrand 14.05.2019 22:16

Это правильный ответ, который выводит желаемый формат OP, просто позаботьтесь о часовых поясах

Accountant م 26.08.2019 23:55

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 (дата, формат) для получения дополнительных форматов даты.

Предлагаемый мной подход работает следующим образом. Сначала вы создаете базовый объект 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 - надеюсь, то, что вы ожидаете.

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

Другие вопросы по теме