From: Gustavo André dos Santos Lopes Date: Sun, 6 May 2012 11:06:44 +0000 (+0200) Subject: Keep date precision in MessageFormatter. X-Git-Tag: php-5.5.0alpha1~204^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ac33e40d2ae7288f66f5e3d56e7ae8e3f0266144;p=php Keep date precision in MessageFormatter. MessageFormatter::parse and MessageFormat::format (and their static equivalents) now don't throw away better than second precision in the arguments. It's already bad enough that in MessageFormatter and IntlDateFormatter we use seconds since epoch instead of milliseconds since epoch, deviating from the ICU date representations. But we don't need to throw away extra precision when parsing dates; we can keep the seconds since epoch convention and return non integer doubles with only a small BC impact. Note that we already could return doubles from MessageFormatter::parse if the date was sufficiently in the past or in the future. --- diff --git a/UPGRADING b/UPGRADING index 9f76366368..1643bdd6bb 100755 --- a/UPGRADING +++ b/UPGRADING @@ -57,6 +57,9 @@ PHP X.Y UPGRADE NOTES - MessageFormatter::format() and related functions now don't error out when an insufficient argument count is provided. Instead, the placeholders will remain unsubstituted. +- MessageFormatter::parse() and MessageFormat::format() (and their static + equivalents) now don't throw away better than second precision in the + arguments. ======================================== 5. New Functions diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index 42c5466153..f8228df4d3 100755 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -665,11 +665,7 @@ U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval ***args, UC switch(fargs[i].getType()) { case Formattable::kDate: aDate = ((double)fargs[i].getDate())/U_MILLIS_PER_SECOND; - if(aDate > LONG_MAX || aDate < -LONG_MAX) { - ZVAL_DOUBLE((*args)[i], aDate<0?ceil(aDate):floor(aDate)); - } else { - ZVAL_LONG((*args)[i], (long)aDate); - } + ZVAL_DOUBLE((*args)[i], aDate); break; case Formattable::kDouble: diff --git a/ext/intl/tests/msgfmt_millisecond_dates.phpt b/ext/intl/tests/msgfmt_millisecond_dates.phpt new file mode 100644 index 0000000000..6d6cf20491 --- /dev/null +++ b/ext/intl/tests/msgfmt_millisecond_dates.phpt @@ -0,0 +1,31 @@ +--TEST-- +MessageFrormatter parses and formats dates with millisecond precision +--SKIPIF-- +format(array(1336310569.123))); + +$p = 'On 2012-05-06 AD at 15:22:49.123 GMT+02:00 something odd happened'; +var_dump($mf->parse($p)); + +?> +==DONE== +--EXPECTF-- +string(%d) "On 2012-05-0%d AD at %d:%d:49.123 %s something odd happened" +array(1) { + [0]=> + float(1336310569.123) +} +==DONE== \ No newline at end of file