Установка часового пояса MySQL во время выполнения с помощью Perl DBIx

У меня есть приложение Perl Catalyst, которое несколько раз хранится в базе данных MySQL. Время имеет тип TIMESTAMP и инициализируется функцией NOW().

При считывании времени они оказываются в часовом поясе базы данных по умолчанию. Однако при использовании оболочки mysql я могу легко установить часовой пояс с помощью SET time_zone = '+03:00'; и получить правильное местное время для своего часового пояса.

Есть ли способ установить подобное время в Catalyst или DBIx во время выполнения?

Я хочу иметь возможность поддерживать разные часовые пояса для разных пользователей, поэтому недостаточно просто изменить часовой пояс по умолчанию для базы данных. Я также знаю, что я могу отформатировать время в Perl после того, как получу данные из MySQL, но с Catalyst, DBIx и Template Toolkit происходит так много автоматизации, что получить правильные данные из базы данных для начала было бы так много. более удобно.


person Runar Buvik    schedule 09.12.2015    source источник
comment
Итак, вы хотите получить данные и сделать так, чтобы сама БД изменяла значения, которые вы получаете, в зависимости от ваших параметров. Я думаю, что это не очень хорошая практика, возможно, вам следует подумать о сохранении часового пояса вместе со временем и извлечении обоих полей или, возможно, о получении разницы дат, где вы фактически суммируете корректировку часового пояса с фактической датой.   -  person ChatterOne    schedule 09.12.2015
comment
Я понял, что у вас есть дата и время в вашей БД, и вы хотите представить их пользователю в локальном часовом поясе пользователя, который отличается для каждого отдельного пользователя. Это то, что должно быть сделано в представлении. Вы можете заставить DBIC преобразовывать поля TIMESTAMP в объекты DateTime и работать с ними. Возможно, введите автоматический фильтр в свой класс View, который всегда применяется к ним, и пусть DateTime обрабатывает преобразование.   -  person simbabque    schedule 09.12.2015
comment
Да, в идеале я хотел бы установить часовой пояс и волшебным образом добавить поддержку местных часовых поясов для своих пользователей. Если нет, я думаю, мне придется добавить функцию в результат или представление схемы. Это не так сложно сделать, но требует множества изменений в большой и сложной кодовой базе.   -  person Runar Buvik    schedule 09.12.2015
comment
Обратите внимание, что «DBIC» — это сокращение от DBIx::Class, DBIx — это все пространство имен расширения DBI.   -  person Alexander Hartmaier    schedule 09.12.2015


Ответы (1)


Мой общий совет - установить дату и время в вашем приложении, а не полагаться на дату и время сервера базы данных. Если вам не нужно знать, какой часовой пояс имел дату и время, когда он был установлен, вы должны сохранить его в формате UTC. Если вам нужно узнать часовой пояс позже, вам нужно использовать тип данных базы данных, который поддерживает это, например «отметка времени с часовым поясом» в Oracle.

См. мой ответ для Форматирование поля метки времени для вывода в TemplateToolkit кажется, это то, о чем вы спрашиваете.

person Alexander Hartmaier    schedule 09.12.2015