Как отобразить дату в формате ISO 8601 с PHP - PullRequest
53 голосов
/ 24 мая 2009

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

17 октября 2008 г. выходит как: 1969-12-31T18: 33: 28-06: 00, что явно неверно (год должен быть 2008, а не 1969)

Это код, который я использую:

<?= date("c", $post[3]) ?>

$post[3] is the datetime (CURRENT_TIMESTAMP) из моей базы данных MySQL.

Есть идеи, что не так?

Ответы [ 5 ]

70 голосов
/ 24 мая 2009

Второй аргумент date - это отметка времени UNIX, а не строка отметки времени базы данных.

Вам необходимо преобразовать временную метку вашей базы данных с strtotime .

<?= date("c", strtotime($post[3])) ?>
29 голосов
/ 29 января 2013

Используя DateTime класс , доступный в PHP версии 5.2, это будет сделано так:

$datetime = new DateTime('17 Oct 2008');
echo $datetime->format('c');

Посмотреть в действии

Начиная с PHP 5.4 вы можете сделать это как однострочник:

echo (new DateTime('17 Oct 2008'))->format('c');
13 голосов
/ 20 февраля 2016

Процедурный стиль:

echo date_format(date_create('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

Объектно-ориентированный стиль:

$formatteddate = new DateTime('17 Oct 2008');
echo $datetime->format('c');
// Output : 2008-10-17T00:00:00+02:00

Гибрид 1:

echo date_format(new DateTime('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

Гибрид 2:

echo date_create('17 Oct 2008')->format('c');
// Output : 2008-10-17T00:00:00+02:00

Примечания:

1) Вы также можете использовать 'Y-m-d\TH:i:sP' в качестве альтернативы 'c' для вашего формата.

2) Часовой пояс по умолчанию для вашего ввода - это часовой пояс вашего сервера. Если вы хотите, чтобы ввод осуществлялся для другого часового пояса, вам нужно явно указать свой часовой пояс. Однако это также повлияет на ваш вывод:

echo date_format(date_create('17 Oct 2008 +0800'), 'c');
// Output : 2008-10-17T00:00:00+08:00

3) Если вы хотите, чтобы выходные данные были для часового пояса, отличного от входного, вы можете явно указать свой часовой пояс:

echo date_format(date_create('17 Oct 2008')->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2008-10-16T18:00:00-04:00
7 голосов
/ 08 апреля 2010

Для предварительно PHP 5:

function iso8601($time=false) {
    if(!$time) $time=time();
    return date("Y-m-d", $time) . 'T' . date("H:i:s", $time) .'+00:00';
}
6 голосов
/ 04 ноября 2010

Вот хорошая функция для предварительной версии PHP 5: В конце я добавил разницу по Гринвичу, она не жестко закодирована.

function iso8601($time=false) {
    if ($time === false) $time = time();
    $date = date('Y-m-d\TH:i:sO', $time);
    return (substr($date, 0, strlen($date)-2).':'.substr($date, -2));
}
...