(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)
IntlDateFormatter::format -- datefmt_format — Форматирует значение даты и времени как строку
Объектно-ориентированный стиль
$datetime): string |false Процедурный стиль
$formatter, IntlCalendar |DateTimeInterface |array |string |int |float $datetime): string |false Метод форматирует значение даты и времени в виде строки.
formatterИсточник средства форматирования даты.
datetimeЗначение, которое требуется отформатировать. Параметр принимает объекты интерфейса DateTimeInterface , объект IntlCalendar , значения с типом numeric, который представляет (возможно, дробное) количество секунд с начала эпохи Unix, или массив (array ) в формате, который возвращает функция localtime() .
Метод не учитывает часовой пояс объектов DateTime и IntlCalendar . Метод отформатирует объект с часовым поясом, который настроили в средстве форматирования. На средстве форматирования вначале вызывают метод IntlDateFormatter::setTimeZone() с часовым поясом объекта форматирования, когда требуется отформатировать объект с часовым поясом, который установили для объекта форматирования. Как альтернативу этому вызывают статический метод IntlDateFormatter::formatObject() .
Метод возвращает строку, которую сформировал при форматировании, или false , если возникла ошибка.
| Версия | Описание |
|---|---|
| 7.1.5 |
Теперь параметр datetime поддерживает
общие объекты DateTimeInterface .
Раньше поддерживались только объекты DateTime .
|
| PECL-модуль intl 3.0.0 |
Теперь параметр datetime
поддерживает объекты IntlCalendar .
|
Пример #1 Пример форматирования значения даты и времени в виде строки функцией datefmt_format()
<?php
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Первый форматированный вывод: ' . datefmt_format($fmt, 0);
$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Второй форматированный вывод: ' . datefmt_format($fmt, 0);
$fmt = datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Первый форматированный вывод с шаблоном: ' . datefmt_format($fmt, 0);
$fmt = datefmt_create(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo "Второй форматированный вывод с шаблоном: " . datefmt_format($fmt, 0);
?>Пример #2 Пример форматирования в объектно-ориентированном стиле
<?php
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Первый форматированный вывод: ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);
echo 'Второй форматированный вывод: ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Первый форматированный вывод с шаблоном: ' . $fmt->format(0);
$fmt = new IntlDateFormatter(
'de-DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN,
'MM/dd/yyyy'
);
echo 'Второй форматированный вывод с шаблоном: ' . $fmt->format(0);
?>Результат выполнения приведённого примера:
Первый форматированный вывод: Wednesday, December 31, 1969 4:00:00 PM PT Второй форматированный вывод: Mittwoch, 31. Dezember 1969 16:00 Uhr GMT-08:00 Первый форматированный вывод с шаблоном: 12/31/1969 Второй форматированный вывод с шаблоном: 12/31/1969
Пример #3 Пример форматирования с объектом IntlCalendar
<?php
$tz = reset(iterator_to_array(IntlTimeZone::createEnumeration('FR')));
$formatter = IntlDateFormatter::create(
'fr_FR',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
$tz,
IntlDateFormatter::GREGORIAN
);
$cal = IntlCalendar::createInstance($tz, '@calendar=islamic-civil');
$cal->set(IntlCalendar::FIELD_MONTH, 8); // 9-й месяц, Рамадан
$cal->set(IntlCalendar::FIELD_DAY_OF_MONTH, 1); // Первый день
$cal->clear(IntlCalendar::FIELD_HOUR_OF_DAY);
$cal->clear(IntlCalendar::FIELD_MINUTE);
$cal->clear(IntlCalendar::FIELD_SECOND);
$cal->clear(IntlCalendar::FIELD_MILLISECOND);
echo "В этом исламском году Рамадан начался или начнётся:\n\t",
$formatter->format($cal), "\n";
// Это часовой пояс средства форматирования:
$formatter->setTimeZone('Asia/Tokyo');
echo "После изменения часового пояса:\n\t",
$formatter->format($cal), "\n"
;
?>Результат выполнения приведённого примера:
В этом исламском году Рамадан начался/начнётся: mardi 9 juillet 2013 19:00:00 heure avancée d’Europe centrale После изменения часового пояса: mercredi 10 juillet 2013 02:00:00 heure normale du Japon
You should know that PHPs IntlDateFormatter class uses ISO date format codes instead of PHPs date() format codes. It is not really clear mentioned from my point of view.
A good list to find ISO codes is available at http://framework.zend.com/manual/1.12/en/zend.date.constants.html#zend.date.constants.selfdefinedformats and such a list should be added here, too.I hope this will save some time for others who have to struggle with different php versions on dev and prod plattform in the future:
when formatting a DateTime object with a *custom pattern*, be sure to use a timestamp to pass at the IntlDateFormatter::format in order to have it working on different php versions:
Example for PHP Version 5.3.5-1ubuntu7.2 (my dev machine):
<?php
$date = new \DateTime();
$dateFormatter = \IntlDateFormatter::create(
\Locale::getDefault(),
\IntlDateFormatter::NONE,
\IntlDateFormatter::NONE,
\date_default_timezone_get(),
\IntlDateFormatter::GREGORIAN,
'EEEE'
);
var_dump($dateFormatter->format($date)); // string(6) "Monday"
?>
Example for PHP Version 5.3.2-1ubuntu4.9 (the prod server):
<?php
// same formatting as above
var_dump($dateFormatter->format($date)); // bool(false)
?>
When using $dateFormatter->format($date->getTimestamp()), you'll always get the formatted and localized string instead of a false.DATE FIELD SYMBOL TABLE
https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table It's important to note that a conversion of timezones will be made from the default timezone (date_default_timezone_set()) and the timezone you passed in the constructor (or datefmt_create()).
If you are inserting the dates into your database as UTC time, make sure to set date_default_timezone_set to UTC as well (or any other timezone, but they need to be the same). Once you call ::format, you will get the converted time.