Skip to content

Commit cdc54b0

Browse files
authored
Merge pull request #274 from alcaeus/fix-dst-shenanigans
Fix wrong handling of timezones when converting UTCDateTime
2 parents 17f31ff + da37f7f commit cdc54b0

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

lib/Mongo/MongoDate.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,14 @@ public function toBSONType()
8888
public function toDateTime()
8989
{
9090
$datetime = new \DateTime();
91+
$datetime->setTimezone(new \DateTimeZone("UTC"));
9192
$datetime->setTimestamp($this->sec);
9293

9394
$microSeconds = $this->truncateMicroSeconds($this->usec);
9495
if ($microSeconds > 0) {
95-
$datetime = \DateTime::createFromFormat('Y-m-d H:i:s.u', $datetime->format('Y-m-d H:i:s') . '.' . str_pad($microSeconds, 6, '0', STR_PAD_LEFT));
96+
$datetime = \DateTime::createFromFormat('Y-m-d H:i:s.u e', $datetime->format('Y-m-d H:i:s') . '.' . str_pad($microSeconds, 6, '0', STR_PAD_LEFT) . ' UTC');
9697
}
9798

98-
$datetime->setTimezone(new \DateTimeZone("UTC"));
99-
10099
return $datetime;
101100
}
102101

tests/Alcaeus/MongoDbAdapter/Mongo/MongoDateTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,33 @@ public function testSupportMillisecondsWithLeadingZeroes()
9595
$this->assertSame(1234567890, $dateTime->getTimestamp());
9696
$this->assertSame('012000', $dateTime->format('u'));
9797
}
98+
99+
public function testDSTTransitionDoesNotProduceWrongResults()
100+
{
101+
$initialTZ = ini_get("date.timezone");
102+
103+
ini_set("date.timezone", "Europe/Madrid");
104+
105+
$date = new \MongoDate(1603584000);
106+
$dateTime = $date->toDateTime();
107+
108+
$this->assertSame(1603584000, $dateTime->getTimestamp());
109+
110+
ini_set("date.timezone", $initialTZ);
111+
}
112+
113+
public function testDSTTransitionDoesNotProduceWrongResultsWithMicroSeconds()
114+
{
115+
$initialTZ = ini_get("date.timezone");
116+
117+
ini_set("date.timezone", "Europe/Madrid");
118+
119+
$date = new \MongoDate(1603584000, 123456);
120+
$dateTime = $date->toDateTime();
121+
122+
$this->assertSame(1603584000, $dateTime->getTimestamp());
123+
$this->assertSame('123000', $dateTime->format('u'));
124+
125+
ini_set("date.timezone", $initialTZ);
126+
}
98127
}

0 commit comments

Comments
 (0)