public function testAsRelativeTime() { $interval_1_second = new DateInterval("PT1S"); $interval_244_seconds = new DateInterval("PT244S"); $interval_1_minute = new DateInterval("PT1M"); $interval_33_minutes = new DateInterval("PT33M"); $interval_1_hour = new DateInterval("PT1H"); $interval_6_hours = new DateInterval("PT6H"); $interval_1_day = new DateInterval("P1D"); $interval_89_days = new DateInterval("P89D"); $interval_1_month = new DateInterval("P1M"); $interval_5_months = new DateInterval("P5M"); $interval_1_year = new DateInterval("P1Y"); $interval_12_years = new DateInterval("P12Y"); // Pass a DateInterval $this->assertSame('a second ago', $this->formatter->asRelativeTime($interval_1_second)); $this->assertSame('244 seconds ago', $this->formatter->asRelativeTime($interval_244_seconds)); $this->assertSame('a minute ago', $this->formatter->asRelativeTime($interval_1_minute)); $this->assertSame('33 minutes ago', $this->formatter->asRelativeTime($interval_33_minutes)); $this->assertSame('an hour ago', $this->formatter->asRelativeTime($interval_1_hour)); $this->assertSame('6 hours ago', $this->formatter->asRelativeTime($interval_6_hours)); $this->assertSame('a day ago', $this->formatter->asRelativeTime($interval_1_day)); $this->assertSame('89 days ago', $this->formatter->asRelativeTime($interval_89_days)); $this->assertSame('a month ago', $this->formatter->asRelativeTime($interval_1_month)); $this->assertSame('5 months ago', $this->formatter->asRelativeTime($interval_5_months)); $this->assertSame('a year ago', $this->formatter->asRelativeTime($interval_1_year)); $this->assertSame('12 years ago', $this->formatter->asRelativeTime($interval_12_years)); // Pass a DateInterval string if (!defined('HHVM_VERSION')) { // TODO format not supported by HHVM currently https://github.com/facebook/hhvm/issues/2952 $this->assertSame('a year ago', $this->formatter->asRelativeTime('2007-03-01T13:00:00Z/2008-05-11T15:30:00Z')); } $this->assertSame('a year ago', $this->formatter->asRelativeTime('2007-03-01T13:00:00Z/P1Y2M10DT2H30M')); $this->assertSame('a year ago', $this->formatter->asRelativeTime('P1Y2M10DT2H30M/2008-05-11T15:30:00Z')); $this->assertSame('a year ago', $this->formatter->asRelativeTime('P1Y2M10DT2H30M')); $this->assertSame('94 months ago', $this->formatter->asRelativeTime('P94M')); // Force the reference time and pass a past DateTime $dateNow = new DateTime('2014-03-13'); $this->assertSame('a second ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_second]), $dateNow)); $this->assertSame('4 minutes ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_244_seconds]), $dateNow)); $this->assertSame('a minute ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_minute]), $dateNow)); $this->assertSame('33 minutes ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_33_minutes]), $dateNow)); $this->assertSame('an hour ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_hour]), $dateNow)); $this->assertSame('6 hours ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_6_hours]), $dateNow)); $this->assertSame('a day ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_day]), $dateNow)); $this->assertSame('2 months ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_89_days]), $dateNow)); $this->assertSame('a month ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_month]), $dateNow)); $this->assertSame('5 months ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_5_months]), $dateNow)); $this->assertSame('a year ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_year]), $dateNow)); $this->assertSame('12 years ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_12_years]), $dateNow)); // Tricky 31-days month stuff // See: http://www.gnu.org/software/tar/manual/html_section/Relative-items-in-date-strings.html $dateNow = new DateTime('2014-03-31'); $dateThen = new DateTime('2014-03-03'); $this->assertSame('28 days ago', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-31', [$interval_1_month]), $dateNow)); $this->assertSame('28 days ago', $this->formatter->asRelativeTime($dateThen, $dateNow)); $dateThen = new DateTime('2014-02-28'); $this->assertSame('a month ago', $this->formatter->asRelativeTime($dateThen, $dateNow)); // Invert all the DateIntervals $interval_1_second->invert = true; $interval_244_seconds->invert = true; $interval_1_minute->invert = true; $interval_33_minutes->invert = true; $interval_1_hour->invert = true; $interval_6_hours->invert = true; $interval_1_day->invert = true; $interval_89_days->invert = true; $interval_1_month->invert = true; $interval_5_months->invert = true; $interval_1_year->invert = true; $interval_12_years->invert = true; // Pass a inverted DateInterval $this->assertSame('in a second', $this->formatter->asRelativeTime($interval_1_second)); $this->assertSame('in 244 seconds', $this->formatter->asRelativeTime($interval_244_seconds)); $this->assertSame('in a minute', $this->formatter->asRelativeTime($interval_1_minute)); $this->assertSame('in 33 minutes', $this->formatter->asRelativeTime($interval_33_minutes)); $this->assertSame('in an hour', $this->formatter->asRelativeTime($interval_1_hour)); $this->assertSame('in 6 hours', $this->formatter->asRelativeTime($interval_6_hours)); $this->assertSame('in a day', $this->formatter->asRelativeTime($interval_1_day)); $this->assertSame('in 89 days', $this->formatter->asRelativeTime($interval_89_days)); $this->assertSame('in a month', $this->formatter->asRelativeTime($interval_1_month)); $this->assertSame('in 5 months', $this->formatter->asRelativeTime($interval_5_months)); $this->assertSame('in a year', $this->formatter->asRelativeTime($interval_1_year)); $this->assertSame('in 12 years', $this->formatter->asRelativeTime($interval_12_years)); // Pass a inverted DateInterval string if (!defined('HHVM_VERSION')) { // TODO format not supported by HHVM currently https://github.com/facebook/hhvm/issues/2952 $this->assertSame('in a year', $this->formatter->asRelativeTime('2008-05-11T15:30:00Z/2007-03-01T13:00:00Z')); } // Force the reference time and pass a future DateTime $dateNow = new DateTime('2014-03-13'); $this->assertSame('in a second', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_second]), $dateNow)); $this->assertSame('in 4 minutes', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_244_seconds]), $dateNow)); $this->assertSame('in a minute', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_minute]), $dateNow)); $this->assertSame('in 33 minutes', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_33_minutes]), $dateNow)); $this->assertSame('in an hour', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_hour]), $dateNow)); $this->assertSame('in 6 hours', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_6_hours]), $dateNow)); $this->assertSame('in a day', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_day]), $dateNow)); $this->assertSame('in 2 months', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_89_days]), $dateNow)); $this->assertSame('in a month', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_month]), $dateNow)); $this->assertSame('in 5 months', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_5_months]), $dateNow)); $this->assertSame('in a year', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_1_year]), $dateNow)); $this->assertSame('in 12 years', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-13', [$interval_12_years]), $dateNow)); // Tricky 31-days month stuff // See: http://www.gnu.org/software/tar/manual/html_section/Relative-items-in-date-strings.html $dateNow = new DateTime('2014-03-03'); $dateThen = new DateTime('2014-03-31'); $this->assertSame('in a month', $this->formatter->asRelativeTime($this->buildDateSubIntervals('2014-03-03', [$interval_1_month]), $dateNow)); $this->assertSame('in 28 days', $this->formatter->asRelativeTime($dateThen, $dateNow)); }
/** * Initializes the component. * This method will check if the "intl" PHP extension is installed and set the * default value of [[locale]]. * @throws InvalidConfigException if the "intl" PHP extension is not installed. */ public function init() { if (!extension_loaded('intl')) { throw new InvalidConfigException('The "intl" PHP extension is not installed. It is required to format data values in localized formats.'); } if ($this->locale === null) { $this->locale = Yii::$app->language; } if ($this->decimalSeparator === null || $this->thousandSeparator === null || $this->currencyCode === null) { $formatter = new NumberFormatter($this->locale, NumberFormatter::DECIMAL); if ($this->decimalSeparator === null) { $this->decimalSeparator = $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL); } if ($this->thousandSeparator === null) { $this->thousandSeparator = $formatter->getSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL); } if ($this->currencyCode === null) { $this->currencyCode = $formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL); } } parent::init(); }