【问题标题】:Setting MySQL time zone at runtime with Perl DBIx使用 Perl DBIx 在运行时设置 MySQL 时区
【发布时间】:2016-03-14 19:00:36
【问题描述】:

我有一个 Perl Catalyst 应用程序,它会在 MySQL 数据库中存储一些时间。时间的类型为 TIMESTAMP,并使用 NOW() 进行初始化。

当读回时间时,它们似乎处于数据库默认时区。但是,当使用 mysql shell 时,我可以通过 SET time_zone = '+03:00'; 轻松设置时区,并为我的时区获取正确的本地时间。

有没有办法在运行时在 Catalyst 或 DBIx 中设置这样的时间?

我希望能够为不同的用户支持不同的时区,所以仅仅改变数据库的默认时区是不够的。我也知道,在从 MySQL 获取数据后,我可以在 Perl 中格式化时间,但是 Catalyst、DBIx 和 Template Toolkit 进行了如此多的自动化操作,因此从数据库中正确获取数据开始会如此之多更方便。

【问题讨论】:

  • 因此,您想要的是检索数据并制作数据,以便数据库本身根据您的参数更改您获得的值。我认为这不是一个好习惯,也许您应该考虑将时区与时间一起存储并检索这两个字段,或者检索一个日期差异,您实际上将时区调整与实际日期相加。
  • 我了解到您的数据库中有日期时间,并且您希望在用户的本地时区将它们呈现给用户,这对于每个单独的用户都是不同的。这是视图中应该做的事情。您可以让 DBIC 将 TIMESTAMP 字段转换为 DateTime 对象并使用它们。也许在您的 View 类中引入一个自动过滤器,该过滤器始终应用于这些过滤器,并让 DateTime 处理转换。
  • 是的,理想情况下我想设置时区并神奇地为我的用户添加了对本地时区的支持。如果不是,我想我将不得不在模式结果或视图中添加一个函数。这并不是很难做到,而是需要在庞大而复杂的代码库中进行多次更改。
  • 注意'DBIC'是DBIx::Class的缩写,DBIx是整个DBI eXtenstion命名空间。

标签: mysql perl catalyst dbix-class


【解决方案1】:

我的一般建议是在您的应用程序中设置日期时间,而不是依赖数据库服务器的日期时间。如果您不需要知道设置日期时间时的时区,则应将其存储为 UTC。如果您以后需要知道时区,则需要使用支持此功能的数据库数据类型,例如 Oracle 中的“带时区的时间戳”。

请参阅我对Formatting timestamp field for output in TemplateToolkit 的回答,这似乎是您要问的。

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 2012-09-21
    • 2012-08-04
    • 2011-01-07
    • 2011-09-21
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多