Смещение часового пояса PHP в MongoDB - PullRequest
3 голосов
/ 03 декабря 2011

Я разрабатываю систему для пожелания дней рождения, используя сообщения на одной доске. Используя MongoDB и PHP.

Теперь реальная проблема заключается в том, что система генерирует сообщение ежедневно, используя CRON Job, и проверяет, есть ли день рождения илинет, если да, то опубликуйте его в масштабе всей системы.Кроме того, каждый пользователь указал свои часовые пояса по умолчанию, а сообщения генерируются с использованием системного времени, которое в настоящее время составляет +5,30 (IST).

Итак, предположим, что система сгенерировала одно сообщение 3 декабря в 12 часов утра, отметка времени, хранящаяся в БДбудет в соответствии с часовым поясом системы.и когда пользователь посещает объект, он показывает то же самое, но мне нужно показать его в соответствии с настройками пользователя.

Пожалуйста, смотрите прикрепленный скриншот.Datetime Problem

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

Код вашего сервера должен использовать UTC, поэтому вам не нужно заботиться о положении вашего сервера.Использование местного времени может привести к проблемам, потому что некоторые моменты времени не существуют или существуют дважды (скачки DST).Однако, когда ваш серверный код действует от имени пользователя, он должен учитывать настройки часового пояса этого пользователя, поэтому вам следует сначала посмотреть его.Однако это зависит от ваших точных требований.

Я бы посоветовал вам взглянуть на Joda Time , чтобы узнать о проблемах и решениях, связанных с часовыми поясами.Это библиотека Java, но, возможно, есть эквивалент в PHP или вы можете узнать из их источников.

Теперь ваши требования: вам нужно убедиться, чего именно вы хотите достичь точно .Пример: у пользователя из Лос-Анджелеса есть друг в Австралии.Когда вы уведомляете пользователя LA о дне рождения австралийца, учитывая огромную разницу во времени?Что делать с людьми, родившимися 29 февраля?Что, если пользователь LA в настоящее время находится в Токио?Я бы сказал, на этом этапе упростите вашу жизнь, потому что точность и своевременное оповещение увеличат проблемупотому что день рождения - это повторяющееся событие, а не момент времени.Вы можете сохранить время следующего уведомления в UTC, но это не так просто - продолжайте читать.

Кроме того, вам нужно сохранить часовой пояс для каждого пользователя.Эти часовые пояса также раздражают , если вам нужна точность : их смещения могут измениться, и их правила перехода на летнее время изменятся (иногда в короткие сроки).Поэтому имеет смысл хранить только TimezoneId.Это является причиной того, что денормализация «следующего времени уведомления» за год может быть проблемой.

Ваши точные требования будут определять код и структуру данных.Мой совет: рассматривать дни рождения как повторяющиеся, продолжительные события местного времени .Сохраните идентификатор часового пояса и дату (без времени!).Ваши дни рождения не «привязаны» к часовому поясу, потому что это не имеет смысла - день рождения «следует за вами», когда вы переходите в другой часовой пояс.

Имеет смысл сохранить следующее уведомление дата и время (UTC) в базе данных, поэтому ваш код поиска уведомлений прост, но имейте в виду, что вам придется обновлять их, если пользователь изменяет свой часовой пояс или правительство внезапно решит ввести DSTПравило.

Как примечание: ваш хрон должен запускаться чаще, чем ежедневно, по крайней мере, ежечасно.

0 голосов
/ 03 декабря 2011

Одним из способов является использование времени серверов при настройке даты и времени.На данный момент это похоже на настройку на ПК пользователя и отображение времени сервера.Что, я полагаю, возможно только с AJAX?

Установка и отображение только с временем сервера и предоставление пользователям выбора для установки их часового пояса.

...