Skip to content

Commit 9aff0b8

Browse files
committed
DateTime: added static method relativeToSeconds() for converting relative time string to seconds
1 parent d7b2b11 commit 9aff0b8

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/Utils/DateTime.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,16 @@ public function setTime(int $hour, int $minute, int $second = 0, int $microsecon
145145
}
146146

147147

148+
/**
149+
* Converts a relative time string (e.g. '10 minut') to seconds.
150+
*/
151+
public static function relativeToSeconds(string $relativeTime): int
152+
{
153+
$now = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
154+
return $now->modify($relativeTime)->getTimestamp() - $now->getTimestamp();
155+
}
156+
157+
148158
/**
149159
* Returns JSON representation in ISO 8601 (used by JavaScript).
150160
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
/**
4+
* Test: Nette\Utils\DateTime::relativeToSeconds()
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Nette\Utils\DateTime;
10+
use Tester\Assert;
11+
12+
require __DIR__ . '/../bootstrap.php';
13+
14+
date_default_timezone_set('Europe/Prague');
15+
16+
17+
test('relativeToSeconds basic usage', function () {
18+
Assert::same(60, DateTime::relativeToSeconds('1 minute'));
19+
Assert::same(600, DateTime::relativeToSeconds('10 minutes'));
20+
Assert::same(-60, DateTime::relativeToSeconds('-1 minute'));
21+
Assert::same(3600, DateTime::relativeToSeconds('+1 hour'));
22+
Assert::same(0, DateTime::relativeToSeconds('now'));
23+
});
24+
25+
test('relativeToSeconds throws on invalid', function () {
26+
Assert::exception(fn() => DateTime::relativeToSeconds('nonsense'), Throwable::class);
27+
});

0 commit comments

Comments
 (0)