|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2013-09-16 17:26 UTC] poinsot dot julien at gmail dot com
Description:
------------
Actually, DateTimeImmutable is not usable everywhere DateTime is.
Missing support I have found is:
* DatePeriod::__construct where end parameter does not allow a DateTimeImmutable objet as date_ce_date is used instead of date_ce_interface
* intl extension (see grep -rn php_date_get_date_ce ext/intl for complete list) which use the function php_date_get_date_ce (so date_ce_date)
Test script:
---------------
var_dump(datefmt_create('fr_FR')->format(date_create_immutable('1970-01-01')));
$start = new DateTimeImmutable('last monday');
var_dump(new DatePeriod($start, DateInterval::createFromDateString('1 day'), $start->add(DateInterval::createFromDateString('5 days'))));
Expected result:
----------------
string(39) "jeudi 1 janvier 1970 00:00:00 UTC+01:00"
object(DatePeriod)#3 (6) {
...
}
Actual result:
--------------
Warning: IntlDateFormatter::format(): datefmt_format: object must be an instance of DateTime in %s on %d
Fatal error: Uncaught exception 'Exception' with message 'DatePeriod::__construct(): This constructor accepts either (DateTimeInterface, DateInterval, int) OR (DateTimeInterface, DateInterval, DateTime) OR (string) as arguments.' in %s:%d
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 14:00:01 2025 UTC |
The commit you mention seems to allow DateTimeImmutable usage with DatePeriod::__construct but still does not fix intl stuffs. Test script: --------------- ini_set('intl.error_level', E_WARNING); var_dump( datefmt_create('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(date_create_immutable('1970-01-01')), datefmt_create('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL)->format(date_create('1970-01-01')) ); Actual result: -------------- Warning: IntlDateFormatter::format(): datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted) in %s on line %d bool(false) string(39) "jeudi 1 janvier 1970 00:00:00 UTC+01:00" Expected result: ---------------- string(39) "jeudi 1 janvier 1970 00:00:00 UTC+01:00" string(39) "jeudi 1 janvier 1970 00:00:00 UTC+01:00"On PHP 7.3 Intl still does not support DateTimeImmutable with formatObject: >>> var_dump(datefmt_format_object(date_create_immutable('1970-01-01'), 'fr_FR')); PHP Warning: datefmt_format_object(): datefmt_format_object: the passed object must be an instance of either IntlCalendar or DateTime One still has to use the long form: >>> var_dump(datefmt_create('fr_FR',NULL,NULL)->format(date_create_immutable('1970-01-01'))); string(42) "jeudi 1 janvier 1970 à 00:00:00 UTC+01:00"