2015-12-09 4 views
1

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

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

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

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

+2

Итак, вы хотите получить данные и сделать так, чтобы сама БД меняла значения, которые вы получаете, в зависимости от ваших параметров. Я думаю, что это не очень хорошая практика, может быть, вам стоит подумать о сохранении часового пояса вместе со временем и извлечении обоих полей или, возможно, получить дату diff, когда вы фактически суммируете настройку часового пояса на фактическую дату. – ChatterOne

+0

Я понял, что у вас есть данные в вашей БД, и вы хотите представить их пользователю в локальном часовом поясе пользователя, который отличается для каждого отдельного пользователя. Это то, что должно быть сделано в представлении. Вы можете сделать DBIC конвертировать 'TIMESTAMP' в объекты DateTime и работать с ними. Возможно, вы вводите автоматический фильтр в свой класс View, который всегда применяется к ним, и обработчик DateTime обрабатывает преобразование. – simbabque

+0

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

ответ

2

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

См. Мой ответ за Formatting timestamp field for output in TemplateToolkit, который, кажется, является тем, о чем вы просите.