From 3b0f5614800dba4a7d7009f9755aed422562c00f Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 23 Sep 2014 12:13:00 +0200 Subject: [PATCH] format timestamps with invalid date input fixes #4989 --- framework/i18n/Formatter.php | 8 ++++++-- tests/unit/framework/i18n/FormatterTest.php | 9 +++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/framework/i18n/Formatter.php b/framework/i18n/Formatter.php index eec947ff7a..b19dabb0d7 100644 --- a/framework/i18n/Formatter.php +++ b/framework/i18n/Formatter.php @@ -548,13 +548,17 @@ class Formatter extends Component $value = 0; } try { - if (is_numeric($value)) { - // process as unix timestamp + if (is_numeric($value)) { // process as unix timestamp if (($timestamp = DateTime::createFromFormat('U', $value)) === false) { throw new InvalidParamException("Failed to parse '$value' as a UNIX timestamp."); } return $timestamp; + } elseif (($timestamp = DateTime::createFromFormat('Y-m-d', $value)) !== false) { // try Y-m-d format + return $timestamp; + } elseif (($timestamp = DateTime::createFromFormat('Y-m-d H:i:s', $value)) !== false) { // try Y-m-d H:i:s format + return $timestamp; } + // finally try to create a DateTime object with the value $timestamp = new DateTime($value); return $timestamp; } catch(\Exception $e) { diff --git a/tests/unit/framework/i18n/FormatterTest.php b/tests/unit/framework/i18n/FormatterTest.php index 0eed5af5e9..1cf26ab7d3 100644 --- a/tests/unit/framework/i18n/FormatterTest.php +++ b/tests/unit/framework/i18n/FormatterTest.php @@ -454,7 +454,8 @@ class FormatterTest extends TestCase public function dateInputs() { return [ - [false, '2014-13-01', 'yii\base\InvalidParamException'], +// ['2015-01-01 00:00:00', '2014-13-01'], // TODO evals to current time on that date + ['2015-01-01 00:00:00', '2014-13-01 00:00:00'], [false, 'asdfg', 'yii\base\InvalidParamException'], // [(string)strtotime('now'), 'now'], // fails randomly ]; @@ -476,9 +477,9 @@ class FormatterTest extends TestCase if ($expectedException !== null) { $this->setExpectedException($expectedException); } - $this->assertSame($expected, $this->formatter->asDate($value, 'php:U')); - $this->assertSame($expected, $this->formatter->asTime($value, 'php:U')); - $this->assertSame($expected, $this->formatter->asDatetime($value, 'php:U')); + $this->assertSame($expected, $this->formatter->asDate($value, 'yyyy-MM-dd HH:mm:ss')); + $this->assertSame($expected, $this->formatter->asTime($value, 'yyyy-MM-dd HH:mm:ss')); + $this->assertSame($expected, $this->formatter->asDatetime($value, 'yyyy-MM-dd HH:mm:ss')); }