From efef8eb70293bdd28397e7dec81b4f86f16523cb Mon Sep 17 00:00:00 2001 From: kenjis Date: Mon, 20 Jun 2022 08:02:45 +0900 Subject: [PATCH] fix: getAge() calculation --- system/I18n/Time.php | 9 +++++---- tests/system/I18n/TimeTest.php | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/system/I18n/Time.php b/system/I18n/Time.php index 659a0a252d..77141a840e 100644 --- a/system/I18n/Time.php +++ b/system/I18n/Time.php @@ -452,7 +452,7 @@ class Time extends DateTime } /** - * Returns the age in years from the "current" date and 'now' + * Returns the age in years from the date and 'now' * * @throws Exception * @@ -460,11 +460,12 @@ class Time extends DateTime */ public function getAge() { - $now = self::now()->getTimestamp(); - $time = $this->getTimestamp(); + $now = self::now(); + + $age = (int) (((int) $now->format('Ymd') - (int) $this->format('Ymd')) / 10000); // future dates have no age - return max(0, date('Y', $now) - date('Y', $time)); + return max(0, $age); } /** diff --git a/tests/system/I18n/TimeTest.php b/tests/system/I18n/TimeTest.php index d7ffa72cd9..2db4fcc48c 100644 --- a/tests/system/I18n/TimeTest.php +++ b/tests/system/I18n/TimeTest.php @@ -402,6 +402,30 @@ final class TimeTest extends CIUnitTestCase $this->assertSame(0, $time->getAge()); } + public function testGetAgeSameDayOfBirthday() + { + Time::setTestNow('December 31, 2022', 'America/Chicago'); + $time = Time::parse('December 31, 2020'); + + $this->assertSame(2, $time->getAge()); + } + + public function testGetAgeNextDayOfBirthday() + { + Time::setTestNow('January 1, 2022', 'America/Chicago'); + $time = Time::parse('December 31, 2020'); + + $this->assertSame(1, $time->getAge()); + } + + public function testGetAgeBeforeDayOfBirthday() + { + Time::setTestNow('December 30, 2021', 'America/Chicago'); + $time = Time::parse('December 31, 2020'); + + $this->assertSame(0, $time->getAge()); + } + public function testGetQuarter() { $time = Time::parse('April 15, 2015');