MySQL и PHP – как преобразовать дату, время и часовой пояс при раздельном хранении

В нашем приложении мы сейчас храним дату, время и часовой пояс отдельно. Поле даты является необязательным, поэтому мы все разделили. Для пользовательского интерфейса они специально выбирают дату, время и часовой пояс. В настоящее время все хранится в формате UTC, а часовой пояс будет идентификатором, который ссылается на другую таблицу поиска.

Насколько я понимаю и вижу, мы можем отображать дату и время, указанные пользователем, просто показывая все три этих значения без необходимости что-либо настраивать. Если они ввели 11-30-15 18:00 по тихоокеанскому стандартному времени, это то, что они увидят, в том формате, который мы считаем нужным.

  • Есть ли какие-либо неотложные проблемы, которые кто-то может подумать о том, чтобы сделать это таким образом?
  • Как я должен обрабатывать преобразование времени? В какой-то момент системе необходимо понять фактическое время. Системное время — UTC, но если какую-то работу необходимо выполнить в 11:00 по тихоокеанскому стандартному времени, необходимо это знать. Мне интересно, есть ли проблема с сохранением времени в формате UTC, но с указанием другого часового пояса. Например, время должно быть PST, но хранится как UTC.

Я использую Laravel с Carbon, просто чтобы предоставить больше информации. Любая обратная связь будет здорово!


person kenshin9    schedule 01.12.2015    source источник
comment
Я думаю, вам лучше сохранить временную метку + часовой пояс пользователя, чем при извлечении даты просто преобразовать ее в локальное время пользователя, используя углерод   -  person Amir Bar    schedule 01.12.2015


Ответы (1)


Храните всю дату, время и часовой пояс в виде одного столбца. Преобразование введенного пользователем времени в GMT и сохранение в БД. Когда вам нужно отобразить время для пользователя, конвертируйте GMT ​​в USERTIMEZONE.

function getGeneralTimeFormat()
{
    return 'Y-m-d H:i:s';
}
function convertDateTimeToGMT($dtime)
{
    date_default_timezone_set('GMT');
    $dtzone = new DateTimeZone(getTimeZoneDateTime($_SESSION['USER_TIMEZONE']));
    $dtime->setTimeZone($dtzone);

    return $dtime->format(getGeneralTimeFormat());
}
function convertGMTToLocalTime($timestamp)
{
    date_default_timezone_set('GMT');
    $dtime = new DateTime($timestamp);
    $dtzone = new DateTimeZone(getTimeZoneDateTime($_SESSION['USER_TIMEZONE']));
    $dtime->setTimeZone($dtzone);

    return $dtime->format(getGeneralTimeFormat());
}
person fatihn    schedule 01.12.2015