Proposal: add IntlDateTimePatternGenerator

From: Date: Sun, 28 Mar 2021 14:54:19 +0000
Subject: Proposal: add IntlDateTimePatternGenerator
Groups: php.internals 
Request: Send a blank email to internals+get-113831@lists.php.net to get a copy of this message
Hello Internals, I would like to propose an addition to the intl extension, IntlDateTimePatternGenerator. ICU exposes the DateTimePatternGenerator class that allows generating a formatting pattern from a given "skeleton" for a given locale. (see https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1DateTimePatternGenerator.html) This allows more flexibility than the current $format argument of IntlDateFormatter::format(), which takes either a few pre-defined constants or a hard-coded format. This functionality also has been requested in the past. (see https://bugs.php.net/bug.php?id=70377) For example, if an application requires a format that will always use the long version of a year, but the short version of a month (eg. "MM/dd/YYYY" for "en_US", or "dd.MM.YYYY" for "de_DE"), one is out of luck. IntlDateFormatter::SHORT will use the short year for "de_DE" ("dd.MM.YY"), and IntlDateFormatter::MEDIUM will use the long version of a month for "en_US" ("MMM dd, YYYY"). With IntlDateTimePatternGenerator::getBestPattern(), a skeleton can be provided to generate the appropriate pattern for a given locale. In the use-case given above, the skeleton "YYYYMMdd" will generate the desired patterns for each locale, which can then be passed to IntlDateFormatter::format(). Proposed Signature: ``` class IntlDateTimePatternGenerator { public function __construct(?string $locale = null) {} public static function create(?string $locale = null): ?IntlDateTimePatternGenerator {} public function getBestPattern(string $skeleton): string|false {} } ``` Example use-case: ``` $date = new \DateTime(); $skeleton = "YYYYMMdd"; $dtpg = new \IntlDateTimePatternGenerator(); // uses default locale if not specified $format = $dtpg->getBestPattern($skeleton); echo \IntlDateFormatter::formatObject($date, $format); // outputs "28.03.2020" for "de_DE" locale ``` The proposed implementation can be found here: https://github.com/php/php-src/pull/6771 I assume that this will require an RFC, in which case I request the karma to create one. My wiki account is deltragon. Regards, Mel Dafert

« previous php.internals (#113831) next »