Skip to content

Commit cfb389d

Browse files
committed
feat: Allow default time zone to be changed
1 parent b1a2d57 commit cfb389d

4 files changed

Lines changed: 53 additions & 7 deletions

File tree

phpstan.neon.dist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ parameters:
77
# excludePaths:
88
ignoreErrors:
99
- '#has a nullable return type declaration#'
10+
- '#has parameter .+ with a nullable type declaration#'
11+
- '#has parameter .+ with null as default value#'
1012
ergebnis:
1113
noExtends:
1214
classesAllowedToBeExtended:

rector.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
declare(strict_types=1);
44

55
use Rector\Config\RectorConfig;
6+
use Rector\Naming\Rector\Class_\RenamePropertyToMatchTypeRector;
67
use Rector\Set\ValueObject\LevelSetList;
78
use Rector\Set\ValueObject\SetList;
89

@@ -25,4 +26,10 @@
2526
SetList::EARLY_RETURN,
2627
SetList::INSTANCEOF,
2728
]);
29+
30+
$rectorConfig->skip([
31+
RenamePropertyToMatchTypeRector::class => [
32+
__DIR__ . '/tests',
33+
],
34+
]);
2835
};

src/Convert/Convert.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,13 @@ public static function asDateTimeString(mixed $value): string|null
145145
return $value->format('c');
146146
}
147147

148-
private static function timeZone(): DateTimeZone
148+
public static function timeZone(DateTimeZone|string|null $timeZone = null): DateTimeZone
149149
{
150-
if (!self::$dateTimeZone instanceof DateTimeZone) {
150+
if (is_string($timeZone)) {
151+
self::$dateTimeZone = new DateTimeZone($timeZone);
152+
} elseif ($timeZone instanceof DateTimeZone) {
153+
self::$dateTimeZone = $timeZone;
154+
} elseif (!self::$dateTimeZone instanceof DateTimeZone) {
151155
self::$dateTimeZone = new DateTimeZone(ini_get('date.timezone'));
152156
}
153157

tests/Convert/AsDateTimeImmutableTest.php

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Plook\Tests\TypeGuard\Convert;
66

77
use DateTimeImmutable;
8+
use DateTimeZone;
89
use PHPUnit\Framework\Attributes\CoversClass;
910
use PHPUnit\Framework\Attributes\CoversFunction;
1011
use PHPUnit\Framework\TestCase;
@@ -22,6 +23,18 @@
2223
#[CoversFunction('\Plook\TypeGuard\Convert\asString')]
2324
final class AsDateTimeImmutableTest extends TestCase
2425
{
26+
private readonly DateTimeZone $originalTimeZone;
27+
28+
protected function setUp(): void
29+
{
30+
$this->originalTimeZone = Convert::timeZone();
31+
}
32+
33+
protected function tearDown(): void
34+
{
35+
Convert::timeZone($this->originalTimeZone);
36+
}
37+
2538
public function testConvertsStrings(): void
2639
{
2740
$result = asDateTimeImmutable('2010-09-08T07:06:05+02:00');
@@ -40,20 +53,40 @@ public function testConvertsStringables(): void
4053

4154
public function testConvertsDateTimeImmutableWithSameTimeZone(): void
4255
{
43-
$dateTimeZone = asDateTimeImmutable(new DateTimeImmutable())->getTimezone();
44-
45-
$result = asDateTimeImmutable(new DateTimeImmutable('2010-09-08T07:06:05+00:00', $dateTimeZone));
56+
$result = asDateTimeImmutable(new DateTimeImmutable('2010-09-08T07:06:05', Convert::timeZone()));
4657

4758
self::assertInstanceOf(DateTimeImmutable::class, $result);
4859
self::assertSame('2010-09-08T07:06:05+00:00', $result->format('c'));
4960
}
5061

5162
public function testConvertsDateTimeImmutableWithDifferentTimeZone(): void
5263
{
53-
$result = asDateTimeImmutable(new DateTimeImmutable('2010-09-08T07:06:05+02:00'));
64+
$dateTimeZone = new DateTimeZone('Australia/Adelaide');
65+
66+
$result = asDateTimeImmutable(new DateTimeImmutable('2010-09-08T07:06:05', $dateTimeZone));
67+
68+
self::assertInstanceOf(DateTimeImmutable::class, $result);
69+
self::assertSame('2010-09-07T21:36:05+00:00', $result->format('c'));
70+
}
71+
72+
public function testConvertsDateTimeImmutableDefaultTimeZoneCanBeChangedByDateTimeZone(): void
73+
{
74+
Convert::timeZone(new DateTimeZone('Australia/Adelaide'));
75+
76+
$result = asDateTimeImmutable(new DateTimeImmutable('2010-09-08T07:06:05+00:00'));
77+
78+
self::assertInstanceOf(DateTimeImmutable::class, $result);
79+
self::assertSame('2010-09-08T16:36:05+09:30', $result->format('c'));
80+
}
81+
82+
public function testConvertsDateTimeImmutableDefaultTimeZoneCanBeChangedByTimeZoneName(): void
83+
{
84+
Convert::timeZone('Australia/Adelaide');
85+
86+
$result = asDateTimeImmutable(new DateTimeImmutable('2010-09-08T07:06:05+00:00'));
5487

5588
self::assertInstanceOf(DateTimeImmutable::class, $result);
56-
self::assertSame('2010-09-08T05:06:05+00:00', $result->format('c'));
89+
self::assertSame('2010-09-08T16:36:05+09:30', $result->format('c'));
5790
}
5891

5992
public function testDoesNotTouchNull(): void

0 commit comments

Comments
 (0)