From bf63d850cafc1552ee47b154c696f112e9b64bb5 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Tue, 4 Jul 2023 11:43:27 +0900 Subject: [PATCH] Add new DateTime class has date range weekened method dateRangeHasWeekend with two dates, checks if between those two dates a weekend (sat or sun) is set --- .../Combined/CoreLibsCombinedDateTimeTest.php | 64 +++++++++++++++++++ www/admin/class_test.datetime.php | 20 ++++++ www/lib/CoreLibs/Combined/DateTime.php | 25 ++++++++ 3 files changed, 109 insertions(+) diff --git a/4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php b/4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php index 2dd24809..ddc03cad 100644 --- a/4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php +++ b/4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php @@ -458,6 +458,47 @@ final class CoreLibsCombinedDateTimeTest extends TestCase ]; } + /** + * Undocumented function + * + * @return array + */ + public function dateRangeHasWeekendProvider(): array + { + return [ + 'no weekend' => [ + '2023-07-03', + '2023-07-04', + false + ], + 'start weekend sat' => [ + '2023-07-01', + '2023-07-04', + true + ], + 'start weekend sun' => [ + '2023-07-02', + '2023-07-04', + true + ], + 'end weekend sat' => [ + '2023-07-03', + '2023-07-08', + true + ], + 'end weekend sun' => [ + '2023-07-03', + '2023-07-09', + true + ], + 'long period > 6 days' => [ + '2023-07-03', + '2023-07-27', + true + ] + ]; + } + /** * date string convert test * @@ -780,6 +821,29 @@ final class CoreLibsCombinedDateTimeTest extends TestCase $output ); } + + /** + * Undocumented function + * + * @covers ::dateRangeHasWeekend + * @dataProvider dateRangeHasWeekendProvider + * @testdox dateRangeHasWeekend $start_date and $end_date are expected weekend $expected [$_dataName] + * + * @param string $start_date + * @param string $end_date + * @param bool $expected + * @return void + */ + public function testDateRangeHasWeekend( + string $start_date, + string $end_date, + bool $expected + ): void { + $this->assertEquals( + $expected, + \CoreLibs\Combined\DateTime::dateRangeHasWeekend($start_date, $end_date) + ); + } } // __END__ diff --git a/www/admin/class_test.datetime.php b/www/admin/class_test.datetime.php index 56c8854d..a20fb41c 100644 --- a/www/admin/class_test.datetime.php +++ b/www/admin/class_test.datetime.php @@ -143,6 +143,26 @@ print "DATE-dow[$date];invalid: " . DateTime::setWeekdayNameFromDate($date) . "< print "DATE-dow[$date],long;invalid: " . DateTime::setWeekdayNameFromDate($date, true) . "
"; print "DOW-date[$date];invalid: " . DateTime::setWeekdayNumberFromDate($date) . "
"; +// check date range includes a weekend +// does not: +$start_date = '2023-07-03'; +$end_date = '2023-07-05'; +print "Has Weekend: " . $start_date . " ~ " . $end_date . ": " + . Dgs::prBl(DateTime::dateRangeHasWeekend($start_date, $end_date)) . "
"; +$start_date = '2023-07-03'; +$end_date = '2023-07-10'; +print "Has Weekend: " . $start_date . " ~ " . $end_date . ": " + . Dgs::prBl(DateTime::dateRangeHasWeekend($start_date, $end_date)) . "
"; +$start_date = '2023-07-03'; +$end_date = '2023-07-31'; +print "Has Weekend: " . $start_date . " ~ " . $end_date . ": " + . Dgs::prBl(DateTime::dateRangeHasWeekend($start_date, $end_date)) . "
"; +$start_date = '2023-07-01'; +$end_date = '2023-07-03'; +print "Has Weekend: " . $start_date . " ~ " . $end_date . ": " + . Dgs::prBl(DateTime::dateRangeHasWeekend($start_date, $end_date)) . "
"; + + print ""; // __END__ diff --git a/www/lib/CoreLibs/Combined/DateTime.php b/www/lib/CoreLibs/Combined/DateTime.php index c1f16147..27917886 100644 --- a/www/lib/CoreLibs/Combined/DateTime.php +++ b/www/lib/CoreLibs/Combined/DateTime.php @@ -452,6 +452,31 @@ class DateTime return $days; } } + + /** + * check if a weekend day (sat/sun) is in the given date range + * Can have time too, but is not needed + * + * @param string $start_date Y-m-d + * @param string $end_date Y-m-d + * @return bool True for has weekend, False for has not + */ + public static function dateRangeHasWeekend( + string $start_date, + string $end_date, + ): bool { + $dd_start = new \DateTime($start_date); + $dd_end = new \DateTime($end_date); + if ( + // starts with a weekend + $dd_start->format('N') >= 6 || + // start day plus diff will be 6 and so fall into a weekend + ((int)$dd_start->format('w') + $dd_start->diff($dd_end)->days) >= 6 + ) { + return true; + } + return false; + } } // __END__