Неправильный часовой пояс MongoDate в PHP

Я вставил данные в MongoDB через PHP а одно поле - дата. Итак, согласно документации MongoDB, я использовал new MongoDate() для этого.

В MongoDB Дата хранится как ISODate("2013-07-03T22:56:12Z"). Это означает, что мой часовой пояс Z (= 0Z), поэтому часовой пояс равен 0. Но я нахожусь на западном побережье США, а часовой пояс для моего местоположения - 8Z (Тихоокеанское время).

Когда я набираю new Date() на Mongo в терминале, каждый из них в порядке. Дата ISODate("2013-07-03T22:56:128Z"), поэтому это правильный часовой пояс 8Z.

Моя среда разработки - Windows, а MongoDB - версия 2.4.4

Есть ли что-то для настройки в MongoDB, в PHP-коде или в php.ini, чтобы избежать этой ошибки?

3 ответа

Дата вашей базы данных должна быть в формате UTC; Затем PHP должен соответствующим образом скорректировать - обычно с date_default_timezone_set. Впоследствии вы можете взять дату из базы данных и подключить ее к gmdate("ymd", strtotime($date)).


8Z не является допустимым способом выражения смещения часового пояса в формате ISO8601. Правильный способ:

2013-07-03T22:56:12-08:00

Кроме того, на дату, указанную вами, US Pacific Time находится в режиме летнего времени, поэтому -8 не является правильным смещением. Это должно быть -7.

2013-07-03T22:56:12-07:00

Вы должны понимать, что многие часовые пояса имеют более одного смещения в течение года. См. "Часовой пояс! = Смещение" в вики тегов часового пояса.

Тем не менее, я не уверен, поддерживает ли MongoDB временные смещения, или если вы должны использовать UTC. Возможно, кто-то может прокомментировать или ответить на этот аспект.


Последний класс MongoDate как функция toDateTime(), которая позволяет вам установить часовой пояс.

$mongoDate = new \MongoDate();
$dateTime = $mongoDate->toDateTime()->setTimezone(new \DateTimeZone(date_default_timezone_get()))

Другой способ - создать дату вручную, как показано ниже.

//2017-02-03T13:37:07.000+00:00 
$currentDateTime = date('Y-m-d', time()).'T'.date('H:i:s', time()).'.000+00:00';
$mongoDate = new \MongoDate(strtotime($currentDateTime));

licensed under cc by-sa 3.0 with attribution.