php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #65683 Intl does not support DateTimeImmutable
Submitted: 2013-09-16 17:26 UTC Modified: 2019-03-18 10:42 UTC
Votes:10
Avg. Score:4.6 ± 0.5
Reproduced:9 of 9 (100.0%)
Same Version:4 (44.4%)
Same OS:0 (0.0%)
From: poinsot dot julien at gmail dot com Assigned: nikic (profile)
Status: Closed Package: Date/time related
PHP Version: 5.5.3 OS:
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: poinsot dot julien at gmail dot com
New email:
PHP Version: OS:

 

 [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

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2014-03-27 16:09 UTC] phofstetter at sensational dot ch
This has been fixed in 5f09944662e09ea0b3f93cfab8702f188955e68c which is in 5.5.9 and later.
 [2014-03-28 16:59 UTC] poinsot dot julien at gmail dot com
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"
 [2014-05-19 13:55 UTC] alan at alanpearce dot co dot uk
DateTimeZone::getOffset also doesn't accept a DateTimeImmutable object.
 [2015-12-17 14:05 UTC] attila at szeremi dot org
I'm getting the issue that formatting a DateTimeImmutable with IntlDateFormatter results in an empty string.

PHP version used: PHP 5.5.29-1~dotdeb+7.1 (cli)
 [2017-03-28 22:16 UTC] nikic@php.net
-Summary: Incomplete support of DateTimeImmutable as DateTime(Interface) +Summary: Intl does not support DateTimeImmutable
 [2017-03-28 22:58 UTC] nikic@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: nikic
 [2019-03-10 04:18 UTC] phpweb at thax dot hardliners dot org
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"
 [2019-03-18 10:42 UTC] nikic@php.net
@phpweb: Fixed by https://github.com/php/php-src/commit/433758ceb3e11df184a87e8185fbd7f8b969fb79, thanks for the report.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 12:01:29 2024 UTC