]> granicus.if.org Git - php/commitdiff
Let MessageFormatter and IntlDateFormatter accept DateTimeImmutable as well
authorBen Scholzen <mail@dasprids.de>
Mon, 27 Mar 2017 17:47:14 +0000 (19:47 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 28 Mar 2017 22:20:46 +0000 (00:20 +0200)
NEWS
ext/intl/common/common_date.cpp
ext/intl/tests/dateformat_bug65683.phpt [new file with mode: 0644]
ext/intl/tests/dateformat_format.phpt
ext/intl/tests/dateformat_format_variant2.phpt
ext/intl/tests/dateformat_format_variant3.phpt
ext/intl/tests/msgfmt_format_datetime.phpt
ext/intl/tests/msgfmt_format_error5.phpt

diff --git a/NEWS b/NEWS
index 73aa8c32e45fa261c149c5450fa836514662251e..97f07e10a75fbda3365ca5320b01a7674f89a1fc 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,8 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2017, PHP 7.1.5
 
-
+- Intl:
+  . Fixed bug #65683 (Intl does not support DateTimeImmutable). (Ben Scholzen)
 
 13 Apr 2017, PHP 7.1.4
 
index f1bf75ab0fa67455cf8a17281c26c73d45543b02..98c6393a848c66cc9239e443f3dc458b44dbdc57 100644 (file)
@@ -145,8 +145,8 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
                php_date_obj *datetime;
                datetime = Z_PHPDATE_P(z);
                if (!datetime->time) {
-                       spprintf(&message, 0, "%s: the DateTime object is not properly "
-                                       "initialized", func);
+                       spprintf(&message, 0, "%s: the %s object is not properly "
+                                       "initialized", func, ZSTR_VAL(Z_OBJCE_P(z)->name));
                        intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR,
                                message, 1);
                        efree(message);
@@ -205,7 +205,7 @@ U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err, const char *func)
                rv = U_MILLIS_PER_SECOND * Z_DVAL_P(z);
                break;
        case IS_OBJECT:
-               if (instanceof_function(Z_OBJCE_P(z), php_date_get_date_ce())) {
+               if (instanceof_function(Z_OBJCE_P(z), php_date_get_interface_ce())) {
                        intl_datetime_decompose(z, &rv, NULL, err, func);
                } else if (instanceof_function(Z_OBJCE_P(z), Calendar_ce_ptr)) {
                        Calendar_object *co = Z_INTL_CALENDAR_P(z);
@@ -228,7 +228,7 @@ U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err, const char *func)
                } else {
                        /* TODO: try with cast(), get() to obtain a number */
                        spprintf(&message, 0, "%s: invalid object type for date/time "
-                                       "(only IntlCalendar and DateTime permitted)", func);
+                                       "(only IntlCalendar and DateTimeInterface permitted)", func);
                        intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR,
                                message, 1);
                        efree(message);
diff --git a/ext/intl/tests/dateformat_bug65683.phpt b/ext/intl/tests/dateformat_bug65683.phpt
new file mode 100644 (file)
index 0000000..d18cb4c
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Bug #65683 IntlDateFormatter accepts DateTimeImmutable
+--SKIPIF--
+<?php
+if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?>
+--FILE--
+<?php
+
+$formatter = new IntlDateFormatter('en-US', IntlDateFormatter::FULL, IntlDateFormatter::NONE, new DateTimeZone("UTC"));
+var_dump($formatter->format(new DateTimeImmutable('2017-03-27 00:00:00 UTC'))) . "\n";
+
+?>
+==DONE==
+--EXPECTF--
+string(%s) "Monday, March %d, 2017"
+==DONE==
index 241c5f975a63aad2ed264f3a8ddcd9a8fca7f1fb..a0135a809cc120918e5cb23282e4db78cbb2f5f3 100644 (file)
@@ -400,24 +400,24 @@ Formatted DateTime is : 20001230 05:04 PM
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
index 07c67e9322990a72474d9c8b51c5f97b490a5a7c..a3df39aa9520fe13fa73a3bf6ae98f206042587b 100644 (file)
@@ -400,24 +400,24 @@ Formatted DateTime is : 20001230 05:04 PM
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
index d770473f44064499a6d21290bb7a5cf7a366b1c2..da0d662ca7916b9179f1c2e0641b6c8d25014e8a 100644 (file)
@@ -400,24 +400,24 @@ Formatted DateTime is : 20001230 05:04 PM
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
 ------------
 Date is: stdClass::__set_state(array(
 ))
 ------------
-Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR'
+Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted): U_ILLEGAL_ARGUMENT_ERROR'
index 07e7d68f144cdf9b0d593c15a2c2a33763fade6c..bf0d24ba6a3b72862f86db6d87aaca01cc02ca68 100644 (file)
@@ -16,13 +16,16 @@ $fmt = <<<EOD
 EOD;
 
 $dt = new DateTime("2012-05-06 18:00:42", new DateTimeZone("Europe/Lisbon"));
+$dti = new DateTimeImmutable("2012-05-06 18:00:42", new DateTimeZone("Europe/Lisbon"));
 
 $mf = new MessageFormatter('en_US', $fmt);
 
 var_dump($mf->format(array($dt)));
+var_dump($mf->format(array($dti)));
 
 ?>
 ==DONE==
 --EXPECTF--
 string(%s) "May %d, 2012 %d:%d:42 %s"
+string(%s) "May %d, 2012 %d:%d:42 %s"
 ==DONE==
index ebbd4550e8f462331d757cc534b8ca454baed9c9..d5f62f9baffdb3c116cfb406e9ca8b8b8b79aa02 100644 (file)
@@ -20,7 +20,7 @@ $mf = new MessageFormatter('en_US', $fmt);
 var_dump($mf->format(array("foo" => new stdclass())));
 
 --EXPECTF--
-Warning: MessageFormatter::format(): msgfmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted) in %s on line %d
+Warning: MessageFormatter::format(): msgfmt_format: invalid object type for date/time (only IntlCalendar and DateTimeInterface permitted) in %s on line %d
 
 Warning: MessageFormatter::format(): The argument for key 'foo' cannot be used as a date or time in %s on line %d
 bool(false)