diff --git a/src/Jenssegers/Mongodb/Eloquent/Model.php b/src/Jenssegers/Mongodb/Eloquent/Model.php index 54ef5129b..9e1cf9bd7 100644 --- a/src/Jenssegers/Mongodb/Eloquent/Model.php +++ b/src/Jenssegers/Mongodb/Eloquent/Model.php @@ -99,7 +99,13 @@ protected function asDateTime($value) { // Convert UTCDateTime instances. if ($value instanceof UTCDateTime) { - return Date::createFromTimestampMs($value->toDateTime()->format('Uv')); + $date = $value->toDateTime(); + + $seconds = $date->format('U'); + $milliseconds = abs($date->format('v')); + $timestampMs = sprintf('%d%03d', $seconds, $milliseconds); + + return Date::createFromTimestampMs($timestampMs); } return parent::asDateTime($value); diff --git a/tests/ModelTest.php b/tests/ModelTest.php index ce7177fe6..23b76cc3e 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -425,6 +425,14 @@ public function testDates(): void $user = User::create(['name' => 'Jane Doe', 'birthday' => '2005-08-08']); $this->assertInstanceOf(Carbon::class, $user->birthday); + // test millisecond-precision dates after 1970: + $user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08 04.08.37.324')]); + $this->assertInstanceOf(Carbon::class, $user->birthday); + + // test millisecond-precision dates before 1970: + $user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08 04.08.37.324')]); + $this->assertInstanceOf(Carbon::class, $user->birthday); + $user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => '2005-08-08']]); $this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));