Перетворення з дати MySQL в інший формат за допомогою PHP


447

У мене datetimeстовпчик у MySQL.

Як я можу перетворити його на дисплей у мм / dd / yy H: M (AM / PM) за допомогою PHP?


4
Що нам потрібно знати, це як дата зберігається в SQL. Це Timestamp або Datetime або unixtime?
flafur Waage,

Вони зберігаються не в 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
ця відповідь бентежить тему
Алекс К

5
@ 0xBAADF00D: будь ласка, прочитайте питання ще раз ... ніхто не запитував про стандартний формат MySQL.
user7116

3
Звичайно, але, коли існують стандарти, було б непогано дотримуватися стандарту (уникайте головного болю пізніше, коли інший розробник працює над вашим кодом) xD
0xBAADF00D

4
Питання задає висновок у форматі mm / dd / yy H: M (AM / PM), а не "Ymd H: 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 - це лише стовпець дати Тіма.
Просто розвиток

4
Відповідь @AsTeR бентежить лише в тому випадку, якщо ви неправильно прочитали питання. ОП відповів на власне запитання та хоче взяти дату з MySQL та вивести потрібний формат: mm / dd / yy H: M (AM / PM) .
токсалот

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

1
Веселий факт: ця відповідь приблизно еквівалентна відповіді трохи нижче (яка практично не має жодної голоси), але вона отримала> 40 нижчих записів, оскільки відповідає на питання ОП, яке відрізняється від того, яке насправді мають люди, які заходять на цю сторінку.
Clément

110

Якщо ви використовуєте PHP 5, ви також можете спробувати

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

Як зазначено вище в коментарях, стандартний формат("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


Я думаю, що люди беруть участь у тому, що вони заплутані в питанні про ОП. Більшість читає питання, щоб відповідати тому, що воно є насправді. Інша можливість полягає в тому, що це дуже схоже на прийняту відповідь, опубліковану ще 5 років тому.
токсалот

1
Посилання, на яке ви посилаєтесь, не вказує на функцію, яку ви використовуєте, і не пояснює формат. Я думаю, що php.net/function.date.php було б краще.
токсалот

@toxalot Прийнята відповідь неправильна. Це було відредаговано після моєї відповіді та про моє посилання, я замінюю ваше посилання. Спасибі
Тоні Старк

1
Весь цей Q&A має жахливу історію. Прийнята відповідь була невірною між 29 квітня 2013 року та 24 травня 2013 р. Це було правильним, коли ви вперше опублікували свою відповідь. Ваша відповідь була неправильною до 29 травня 2013 року, після чого вона стала дуже схожою на прийняту відповідь.
токсалот

23

Нарешті, правильне рішення для 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

1
Якщо ви працюєте в іншому просторі імен, вам потрібно зателефонувати йому з косою рисою перед ним:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester

2
Не забудьте вказати часовий пояс під час створення об’єкта дати! В іншому випадку ваша форматована дата може зайняти кілька годин. У ваших datetimeстовпцях має бути UTF8, тому передайте new DateTimeZone('UTC')як 3-й параметр, щоб переконатися, що PHP знає.
Eric Seastrand

Це правильна відповідь, яка видає потрібний формат ОП, просто подбайте про часові пояси
Бухгалтер,

12

Простішим способом було б форматування дати безпосередньо в запиті MySQL, а не PHP. Дивіться запис у посібнику MySQL для DATE_FORMAT .

Якщо ви краще зробите це в PHP, тоді вам потрібна функція дати , але вам доведеться спочатку конвертувати значення бази даних у часову позначку.


11
-1 тому, що форматування дати в БД не є гарною ідеєю. Для багатомовних веб потрібні різні формати дати, і тоді вам доведеться форматувати дату в PHP (загальна мова ділової логіки). Коли ви писали про dateфункцію, то вам слід писати про strottimeфункцію також, щоб допомогти комусь замість "але вам доведеться спочатку перетворити значення бази даних у часову позначку".
Борис Шушка

10

Забудьте всіх. Просто використовуйте:

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

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


MySQL насправді не використовує цей формат, і MySQL генерує попередження, якщо ви включите позначувач часового поясу "+ xxxx", який генерується ним. UPDATE X SET Y = '2014-03-31T15: 00: 00 + 0100', де Z; Запит добре, 0 рядків зачеплене, 1 попередження (0,06 сек) Рівні збігаються: 1 Змінено: 0 Попередження: 1
Джордж Лунд

ОП хоче взяти дату з формату MySQL і перетворити на mm / dd / yy H: M (AM / PM) .
токсалот

8

Це має відформатувати поле у ​​запиті SQL:

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

Вам слід вказати запит MySQL , а не лише SQL, оскільки це не обов'язково працюватиме з усіма базами даних. У той час як ОП просила рішення PHP, це хороша альтернатива, про яку ОП, можливо, не знав. Однак це не забезпечить запитуваний формат. Щоб отримати потрібний формат 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));
}

1
Це не відповідає на питання ОП. ОП хоче взяти дату з формату MySQL і перетворити на mm / dd / yy H: M (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.

Прикро мати два різні запити, щоб просто змінити вигляд дати в інтерфейсі користувача.


Мені подобається ідея використання UNIX_TIMESTAMPдля усунення потреби в strtotime. Ця відповідь була б кращою, якби вона наводила приклад форматування часу у форматі, який фактично запитували.
токсалот

1

Ви можете мати проблеми з датами, які не повернулися в Unix Timestamp, тому це працює для мене ...

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

1
Це не перетворює дату у формат, який вимагає ОП.
токсалот

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 .


Це не перетворює дату у формат, який вимагає ОП
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'])))."'";

1
Це не відповідає на питання ОП. ОП хоче взяти дату з формату MySQL і перетворити на mm / dd / yy H: M (AM / PM) . Це робить навпаки. Плюс це вимагає введення даних із форми, а не бази даних.
токсалот
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.