From b28cbd70995dbee5c5b578bf7ffb6c15f386092a Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sat, 6 Apr 2024 11:32:25 +0400 Subject: [PATCH] modifs.mineures sans commentaires --- src/php/time/DateTime.php | 59 ++++++++++++++++++++++++++++++++++++- tests/php/time/DateTest.php | 20 +++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/php/time/DateTime.php b/src/php/time/DateTime.php index ab3f22d..8090f9d 100644 --- a/src/php/time/DateTime.php +++ b/src/php/time/DateTime.php @@ -46,6 +46,49 @@ class DateTime extends \DateTime { return $clone; } + /** + * corriger une année à deux chiffres qui est située dans le passé et + * retourner l'année à 4 chiffres. + * + * par exemple, si l'année courante est 2019, alors: + * - fix_past_year('18') === '2018' + * - fix_past_year('19') === '1919' + * - fix_past_year('20') === '1920' + */ + static function fix_past_year(int $year): int { + if ($year < 100) { + $y = getdate(); $y = $y["year"]; + $r = $y % 100; + $c = $y - $r; + if ($year >= $r) $year += $c - 100; + else $year += $c; + } + return $year; + } + + /** + * corriger une année à deux chiffres et retourner l'année à 4 chiffres. + * l'année charnière entre année passée et année future est 70 + * + * par exemple, si l'année courante est 2019, alors: + * - fix_past_year('18') === '2018' + * - fix_past_year('19') === '2019' + * - fix_past_year('20') === '2020' + * - fix_past_year('69') === '2069' + * - fix_past_year('70') === '1970' + * - fix_past_year('71') === '1971' + */ + static function fix_any_year(int $year): int { + if ($year < 100) { + $y = intval(date("Y")); + $r = $y % 100; + $c = $y - $r; + if ($year >= 70) $year += $c - 100; + else $year += $c; + } + return $year; + } + function __construct($datetime="now", DateTimeZone $timezone=null) { if ($datetime instanceof \DateTimeInterface) { if ($timezone === null) $timezone = $datetime->getTimezone(); @@ -53,9 +96,23 @@ class DateTime extends \DateTime { $this->setTimestamp($datetime->getTimestamp()); $this->setTimezone($timezone); } elseif (is_int($datetime)) { - parent::__construct(); + parent::__construct("now", $timezone); $this->setTimestamp($datetime); + } elseif (!is_string($datetime)) { + throw new InvalidArgumentException("datetime must be a string or an instance of DateTimeInterface"); } else { + if (preg_match('/^(\d+)\/(\d+)\/(\d+)$/', $datetime, $ms)) { + $y = self::fix_any_year(intval($ms[3])); + $datetime = sprintf("%04d-%02d-%02d", $y, intval($ms[2]), intval($ms[1])); + } elseif (preg_match('/^(\d+)\/(\d+)$/', $datetime, $ms)) { + $datetime = sprintf("%04d-%02d-%02d", intval(date("Y")), intval($ms[2]), intval($ms[1])); + } elseif (preg_match('/^(\d{4})(\d{2})(\d{2})$/', $datetime, $ms)) { + $datetime = sprintf("%04d-%02d-%02d", intval($ms[1]), intval($ms[2]), intval($ms[3])); + } elseif (preg_match('/^(\d{2})(\d{2})(\d{2})$/', $datetime, $ms)) { + $y = self::fix_any_year(intval($ms[1])); + $datetime = sprintf("%04d-%02d-%02d", $y, intval($ms[2]), intval($ms[3])); + } + #XXX ajouter datetime et YYYYmmddTHHMMSS[Z] parent::__construct($datetime, $timezone); } } diff --git a/tests/php/time/DateTest.php b/tests/php/time/DateTest.php index 02d3bdc..d77676e 100644 --- a/tests/php/time/DateTest.php +++ b/tests/php/time/DateTest.php @@ -32,4 +32,24 @@ class DateTest extends TestCase { $clone = Date::clone($date); self::assertInstanceOf(DateTime::class, $clone); } + + function testConstruct() { + $y = date("Y"); + self::assertSame("05/04/$y", strval(new Date("5/4"))); + self::assertSame("05/04/2024", strval(new Date("5/4/24"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024"))); + self::assertSame("05/04/2024", strval(new Date("05/04/2024"))); + self::assertSame("05/04/2024", strval(new Date("20240405"))); + self::assertSame("05/04/2024", strval(new Date("240405"))); + self::assertSame("05/04/2024", strval(new Date("20240405T091523"))); + self::assertSame("05/04/2024", strval(new Date("20240405T091523Z"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 9:15:23"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 9.15.23"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 9:15"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 9.15"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 9h15"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 09:15:23"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 09:15"))); + self::assertSame("05/04/2024", strval(new Date("5/4/2024 09h15"))); + } }