diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php
index ad8542bc..387b911d 100644
--- a/includes/view/ShiftCalendarRenderer.php
+++ b/includes/view/ShiftCalendarRenderer.php
@@ -2,6 +2,7 @@
namespace Engelsystem;
+use Engelsystem\Helpers\Carbon;
use Engelsystem\Models\Shifts\Shift;
use Engelsystem\Models\Shifts\ShiftEntry;
use Illuminate\Support\Collection;
@@ -212,20 +213,21 @@ class ShiftCalendarRenderer
*/
private function renderTick($time, $label = false)
{
+ $time = Carbon::createFromTimestamp($time);
$class = $label ? 'tick bg-' . theme_type() : 'tick ';
- if ($time % (24 * 60 * 60) == 23 * 60 * 60) {
+ if ($time->isStartOfDay()) {
if (!$label) {
return div($class . ' day');
}
return div($class . ' day', [
- date(__('m-d'), $time) . '
' . date(__('H:i'), $time),
+ $time->format(__('m-d')) . '
' . $time->format(__('H:i')),
]);
- } elseif ($time % (60 * 60) == 0) {
+ } elseif ($time->isStartOfHour()) {
if (!$label) {
return div($class . ' hour');
}
return div($class . ' hour', [
- date(__('m-d'), $time) . '
' . date(__('H:i'), $time),
+ $time->format(__('m-d')) . '
' . $time->format(__('H:i')),
]);
}
return div($class);
diff --git a/src/Helpers/Carbon.php b/src/Helpers/Carbon.php
index c12747f5..931a74a8 100644
--- a/src/Helpers/Carbon.php
+++ b/src/Helpers/Carbon.php
@@ -18,7 +18,7 @@ class Carbon extends \Carbon\Carbon
/**
* Parses HTML datetime-local and ISO date/time strings.
*
- * @return \Carbon\Carbon|null Carbon if parseable, else null
+ * @return self|null Carbon if parseable, else null
* @see self::DATETIME_FORMATS
*/
public static function createFromDatetime(string $value): ?\Carbon\Carbon
@@ -43,4 +43,16 @@ class Carbon extends \Carbon\Carbon
$carbon = self::createFromDateTime($value);
return $carbon === null ? null : $carbon->timestamp;
}
+
+ /**
+ * Check if the instance is at the start of an hour.
+ *
+ * @param bool $checkMicroseconds check time at microseconds precision
+ */
+ public function isStartOfHour(bool $checkMicroseconds = false): bool
+ {
+ return $checkMicroseconds
+ ? $this->rawFormat('i:s.u') === '00:00.000000'
+ : $this->rawFormat('i:s') === '00:00';
+ }
}
diff --git a/tests/Unit/Helpers/CarbonTest.php b/tests/Unit/Helpers/CarbonTest.php
index 3566dd81..d1d8b308 100644
--- a/tests/Unit/Helpers/CarbonTest.php
+++ b/tests/Unit/Helpers/CarbonTest.php
@@ -65,4 +65,28 @@ class CarbonTest extends TestCase
$timestamp = Carbon::createTimestampFromDatetime($value);
self::assertNull($timestamp);
}
+
+ public function startOfHourDates(): array
+ {
+ return [
+ ['2022-04-16 10:00:00.000000', true],
+ ['2022-04-16 10:00:00.000000', true, true],
+ ['2022-04-16 10:00:00.123456', true, false],
+ ['2022-04-16 23:00:00.000000', true, false],
+ ['2022-04-16 10:00:42.000000', false],
+ ['2022-04-16 10:23:00.000000', false],
+ ['2022-04-16 10:00:00.123456', false, true],
+ ];
+ }
+
+ /**
+ * @covers \Engelsystem\Helpers\Carbon::isStartOfHour
+ * @dataProvider startOfHourDates
+ */
+ public function testIsStartOfHour(string $value, bool $expected, bool $checkMicroseconds = false): void
+ {
+ $date = Carbon::createFromFormat('Y-m-d H:i:s.u', $value);
+
+ $this->assertEquals($expected, $date->isStartOfHour($checkMicroseconds));
+ }
}