PHP RFC: intl_date_format
- Version: 1.0
- Date: 2026-09-28
- Author: Sepehr Mahmoudi (sepehrphpr@gmail.com)
- Target Version: PHP 8.7
- Status: Draft
Introduction
This proposal introduces a new procedural function intl_date_format() to the ext/intl extension. The goal is to provide a simplified, developer-friendly interface for formatting date and time using IntlDateFormatter's capabilities, without the overhead of instantiating and configuring objects for simple use cases.
Motivation
Currently, using IntlDateFormatter for standard formatting requires significant boilerplate code: instantiating an object, setting the timezone and calendar, and finally calling the format method. Adding a procedural function, similar to the core date() function, will improve ergonomics and development speed for internationalized applications.
Proposed Function Signature
function intl_date_format( DateTimeInterface|int|string|float $datetime, ?string $locale = null, int $dateType = IntlDateFormatter::MEDIUM, int $timeType = IntlDateFormatter::MEDIUM, IntlTimeZone|DateTimeZone|string|null $timezone = null, IntlCalendar|int|null $calendar = null, string $pattern = "" ): string {}
Parameters
$datetime: The date/time to format. Can be aDateTimeInterfaceobject, a Unix timestamp (int/float), or a valid date string.$locale: The locale to use (e.g.,fa_IR,en_US). Ifnull, the default system locale is used.$dateType: The date formatter constant (e.g.,IntlDateFormatter::MEDIUM).$timeType: The time formatter constant (e.g.,IntlDateFormatter::MEDIUM).$timezone: The timezone. Can be aDateTimeZoneobject,IntlTimeZoneobject, or a string identifier.$calendar: The calendar type (e.g.,IntlDateFormatter::TRADITIONAL).$pattern: An optional ICU pattern string. If provided, this overrides the$dateTypeand$timeTypearguments.
Error Handling
This function adheres to modern PHP 8.7 error handling standards:
TypeError: Thrown if invalid data types are passed for any parameter.ValueError: Thrown if invalid numerical values are passed for constants.IntlException: Thrown if the underlying ICU engine encounters an error during formatting.- The function will always return a
stringon success and will never returnfalse.
Examples
1. Quick format with defaults
echo intl_date_format(new DateTime(), 'fa_IR'); // Output example: ۷ مهر ۱۴۰۵، ۱۸:۳۰:۰۰
2. Full Persian date (no time) using Traditional calendar
echo intl_date_format( datetime: '2026-09-28', locale: 'fa_IR', dateType: IntlDateFormatter::FULL, timeType: IntlDateFormatter::NONE, calendar: IntlDateFormatter::TRADITIONAL ); // Output example: دوشنبه ۷ مهر ۱۴۰۵
3. Timestamp with specific timezone
echo intl_date_format( datetime: 1790610000, locale: 'en_US', timezone: 'America/New_York' ); // Output example: Sep 28, 2026, 10:00:00 AM
4. Using a custom pattern
echo intl_date_format( datetime: '2026-09-28 15:30:00', locale: 'fa_IR@calendar=persian', pattern: 'yyyy/MM/dd' ); // Output: ۱۴۰۵/۰۷/۰۷
Backward Compatibility
This is a new function and does not introduce any breaking changes.
Performance
To avoid overhead caused by frequently instantiating formatters in tight loops, the implementation utilizes an internal C-level LRU Cache to store and reuse formatter instances.