How to display a date as iso 8601 format with PHP
I’m trying to display a datetime from my MySQL database as an iso 8601 formated string with PHP but it’s coming out wrong. 17 Oct 2008 is coming out as: 1969-12-31T18:33:28-06:00 which is clearly not correct (the year should be 2008 not 1969) This is the code I’m using:
6 Answers 6
The second argument of date is a UNIX timestamp, not a database timestamp string.
You need to convert your database timestamp with strtotime.
@Christian The ‘c’ format doesn’t include fractions of seconds and John’s answer currently only uses the ‘c’ format, so John’s answer is not an improvement. You’re right that DateTime() allows for a higher resolution, but it doesn’t help you unless you’re using a custom 8601 format with higher res. So, if you’re only using ‘c’ format and you like functional programming, then I think this solution is good. For those that want higher resolution, Clary’s answer provides some examples.
Using the DateTime class available in PHP version 5.2 it would be done like this:
$datetime = new DateTime('17 Oct 2008'); echo $datetime->format('c');
As of PHP 5.4 you can do this as a one-liner:
echo (new DateTime('17 Oct 2008'))->format('c');
Procedural style :
echo date_format(date_create('17 Oct 2008'), 'c'); // Output : 2008-10-17T00:00:00+02:00
Object oriented style :
$formatteddate = new DateTime('17 Oct 2008'); echo $datetime->format('c'); // Output : 2008-10-17T00:00:00+02:00
Hybrid 1 :
echo date_format(new DateTime('17 Oct 2008'), 'c'); // Output : 2008-10-17T00:00:00+02:00
Hybrid 2 :
echo date_create('17 Oct 2008')->format('c'); // Output : 2008-10-17T00:00:00+02:00
Notes :
1) You could also use ‘Y-m-d\TH:i:sP’ as an alternative to ‘c’ for your format.
2) The default time zone of your input is the time zone of your server. If you want the input to be for a different time zone, you need to set your time zone explicitly. This will also impact your output, however :
echo date_format(date_create('17 Oct 2008 +0800'), 'c'); // Output : 2008-10-17T00:00:00+08:00
3) If you want the output to be for a time zone different from that of your input, you can set your time zone explicitly :
echo date_format(date_create('17 Oct 2008')->setTimezone(new DateTimeZone('America/New_York')), 'c'); // Output : 2008-10-16T18:00:00-04:00
function iso8601($time=false)
why not escape T sign . and the !$time condition is not necesary, as current time is used when no time parameter is given or null: date(‘Y-m-d\TH:i:s\Z’, $time);//Z represents current time zone
Here is the good function for pre PHP 5: I added GMT difference at the end, it’s not hardcoded.
function iso8601($time=false)
The problem many times occurs with the milliseconds and final microseconds that many times are in 4 or 8 finals. To convert the DATE to ISO 8601 «date(DATE_ISO8601)» these are one of the solutions that works for me:
// In this form it leaves the date as it is without taking the current date as a reference $dt = new DateTime(); echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z'; // return-> 2020-05-14T13:35:55.191Z // In this form it takes the reference of the current date echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z'); return-> 2020-05-14T13:35:55.191Z // Various examples: $date_in = '2020-05-25 22:12 03.056'; $dt = new DateTime($date_in); echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z'; // return-> 2020-05-25T22:12:03.056Z //In this form it takes the reference of the current date echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z',strtotime($date_in)); // return-> 2020-05-25T14:22:05.188Z
date
Возвращает строку, отформатированную в соответствии с указанным в параметре format шаблоном. Используется метка времени, заданная параметром timestamp (метка времени Unix), или текущее системное время, если параметр timestamp не задан. Таким образом, параметр timestamp является необязательным и по умолчанию равен значению, возвращаемому функцией time() .
Метки времени Unix не обрабатывают часовые пояса. Используйте класс DateTimeImmutable и его метод форматирования DateTimeInterface::format() для форматирования информации о дате/времени с привязкой к часовому поясу.
Список параметров
Замечание: Функция date() всегда будет генерировать 000000 в качестве микросекунд, поскольку она принимает параметр int , тогда как DateTime::format() поддерживает микросекунды, если DateTime был создан с микросекундами.
Необязательный параметр timestamp представляет собой метку времени типа int , по умолчанию равную текущему локальному времени, если timestamp не указан или null . Другими словами, значение по умолчанию равно результату функции time() .
Возвращаемые значения
Возвращает отформатированную строку с датой.
Ошибки
Каждый вызов к функциям даты/времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING , если часовой пояс некорректный. Смотрите также date_default_timezone_set()
Список изменений
Версия | Описание |
---|---|
8.0.0 | timestamp теперь допускает значение null. |
Примеры
Пример #1 Примеры использования функции date()
// установка часового пояса по умолчанию.
date_default_timezone_set ( ‘UTC’ );
?php
// выведет примерно следующее: Monday
echo date ( «l» );
// выведет примерно следующее: Monday 8th of August 2005 03:12:46 PM
echo date ( ‘l jS \of F Y h:i:s A’ );
// выведет: July 1, 2000 is on a Saturday
echo «July 1, 2000 is on a » . date ( «l» , mktime ( 0 , 0 , 0 , 7 , 1 , 2000 ));
/* пример использования константы в качестве форматирующего параметра */
// выведет примерно следующее: Mon, 15 Aug 2005 15:12:46 UTC
echo date ( DATE_RFC822 );
// выведет примерно следующее: 2000-07-01T00:00:00+00:00
echo date ( DATE_ATOM , mktime ( 0 , 0 , 0 , 7 , 1 , 2000 ));
?>
Чтобы запретить распознавание символа как форматирующего, следует экранировать его с помощью обратного слеша. Если экранированный символ также является форматирующей последовательностью, то следует экранировать его повторно.
Пример #2 Экранирование символов в функции date()
Для вывода прошедших и будущих дат удобно использовать функции date() и mktime() .
Пример #3 Пример совместного использования функций date() и mktime()
$tomorrow = mktime ( 0 , 0 , 0 , date ( «m» ) , date ( «d» )+ 1 , date ( «Y» ));
$lastmonth = mktime ( 0 , 0 , 0 , date ( «m» )- 1 , date ( «d» ), date ( «Y» ));
$nextyear = mktime ( 0 , 0 , 0 , date ( «m» ), date ( «d» ), date ( «Y» )+ 1 );
?>?php
Замечание:
Данный способ более надёжен, чем простое вычитание и прибавление секунд к метке времени, поскольку позволяет при необходимости гибко осуществить переход на летнее/зимнее время.
Ещё несколько примеров использования функции date() . Важно отметить, что следует экранировать все символы, которые необходимо оставить без изменений. Это справедливо и для тех символов, которые в текущей версии PHP не распознаются как форматирующие, поскольку это может быть введено в следующих версиях. Для экранировании управляющих последовательностей (например, \n) следует использовать одинарные кавычки.
Пример #4 Форматирование с использованием date()
// Предположим, что текущей датой является 10 марта 2001, 5:16:18 вечера,
// и мы находимся в часовом поясе Mountain Standard Time (MST)
?php
$today = date ( «F j, Y, g:i a» ); // March 10, 2001, 5:16 pm
$today = date ( «m.d.y» ); // 03.10.01
$today = date ( «j, n, Y» ); // 10, 3, 2001
$today = date ( «Ymd» ); // 20010310
$today = date ( ‘h-i-s, j-m-y, it is w Day’ ); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date ( ‘\i\t \i\s \t\h\e jS \d\a\y.’ ); // it is the 10th day.
$today = date ( «D M j G:i:s T Y» ); // Sat Mar 10 17:16:18 MST 2001
$today = date ( ‘H:m:s \m \i\s\ \m\o\n\t\h’ ); // 17:03:18 m is month
$today = date ( «H:i:s» ); // 17:16:18
$today = date ( «Y-m-d H:i:s» ); // 2001-03-10 17:16:18 (формат MySQL DATETIME)
?>
Для форматирования дат на других языках вместо функции date() можно использовать метод IntlDateFormatter::format() .
Примечания
Замечание:
Для получения метки времени из строкового представления даты можно воспользоваться функцией strtotime() . Кроме того, некоторые базы данных имеют собственные функции для преобразования внутреннего представления даты в метку времени (например, функция MySQL » UNIX_TIMESTAMP).
Временную метку начала запроса можно получить из поля $_SERVER[‘REQUEST_TIME’] .
Смотрите также
- DateTimeImmutable::__construct() — Возвращает новый объект DateTimeImmutable
- DateTimeInterface::format() — Возвращает дату, отформатированную согласно переданному формату
- gmdate() — Форматирует дату/время по Гринвичу
- idate() — Преобразует локальное время/дату в целое число
- getdate() — Возвращает информацию о дате/времени
- getlastmod() — Получает время последней модификации страницы
- mktime() — Возвращает метку времени Unix для заданной даты
- IntlDateFormatter::format() — Форматирует значение даты/времени в виде строки
- time() — Возвращает текущую метку системного времени Unix
- Предопределённые константы даты и времени
User Contributed Notes
- Функции даты и времени
- checkdate
- date_add
- date_create_from_format
- date_create_immutable_from_format
- date_create_immutable
- date_create
- date_date_set
- date_default_timezone_get
- date_default_timezone_set
- date_diff
- date_format
- date_get_last_errors
- date_interval_create_from_date_string
- date_interval_format
- date_isodate_set
- date_modify
- date_offset_get
- date_parse_from_format
- date_parse
- date_sub
- date_sun_info
- date_sunrise
- date_sunset
- date_time_set
- date_timestamp_get
- date_timestamp_set
- date_timezone_get
- date_timezone_set
- date
- getdate
- gettimeofday
- gmdate
- gmmktime
- gmstrftime
- idate
- localtime
- microtime
- mktime
- strftime
- strptime
- strtotime
- time
- timezone_abbreviations_list
- timezone_identifiers_list
- timezone_location_get
- timezone_name_from_abbr
- timezone_name_get
- timezone_offset_get
- timezone_open
- timezone_transitions_get
- timezone_version_get
php + mysql вывод даты в другом формате
Как можно сделать вывод даты из mysql в нужном мне формате, ни для кого не секрет что дата хранится в типе date как гггг-мм-дд , мне нужно конвертировать в дд.мм.гггг , при этом не при самом SELECT ‘e, т.е. когда выборка по * и не в цикле перебирать все элементы и конвертировать дату, возможно ли так? Может есть какая-то предустановка, как например кодировку задавать через SET NAMES ?
5 ответов 5
в MySQL нельзя изменить формат по-умолчанию YYYY-MM-DD HH:MI:SS
но вы можете сделать это с помоьюш дополнительных функций как
DATE_FORMAT( datecol , '%d.%m.%Y') AS datecol SELECT DATE_FORMAT(dateColumn,'%d/%m/%Y') AS dateColumn FROM table
В MySQL можно изменить формат вывода даты. Собственно вы неплохо описали как это сделать. Наверное, вы все-таки имели в виду «изменить формат вывода даты по-умолчанию» или что-то еще.
Учитывая, что вопрос задан по MySQL + PHP, скорее всего форматирование даты нужно именно для PHP.
Давайте разберемся. MySQL — это слой данных, т.е. модель. А форматирование данных для пользователя — это уже вопрос отображения, т.е. представление.
Отсюда значит, что вопрос подразумевает смешивание слоев модели и представления прямо в модели. И не просто в модели, а прямо средствами СУБД. А это в корне не правильный подход и принесет в будущем разработчику массу проблем. Например, завтра разработчику нужно будет сделать разное форматирование даты для разных языков интерфейса, а также произоводить с датой некие вычисления. Мне не представляется простой путь, как это сделать?
Поэтому мне не вполне понятно, почему заминусовали предыдущий ответ. Т.к. он предлагает более правильный путь:
(new \IntlDateFormatter(‘ru_RU’, \IntlDateFormatter::SHORT, \IntlDateFormatter::NONE))->format(new \DateTime($mySqlResult[‘createdAt’])));