1

我正在使用生成的 DBIx::Class 模式dbcidump来进行插入和查询。

最近,我发现我所有的时间都比我们的当地时间(EST)提前了 5 小时。

在我的Result课堂上,我有__PACKAGE__->load_components("InflateColumn::DateTime"),其中列定义为"action_time", { data_type => "datetime", is_nullable => 0}...

有没有一种简单的方法可以让我控制时区DateTime对象被膨胀/放气,以便我的查询和插入保持一致?

我已经尝试添加time_zone => 'local'到列定义中,但这没有什么区别。

例如:

  • 插入2012-12-12 10:04:03
  • 检索2012-12-12 15:04:03

样本数据:

sqlite> select datetime(action_time,'localtime'),action_time from actions order by id desc limit 3;
2012-12-12 08:35:07|2012-12-12 13:35:07
2012-12-12 08:34:45|2012-12-12 13:34:45
2012-12-12 08:34:43|2012-12-12 13:34:43

编辑:我相信这与我的使用有关: http ://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/ResultClass/HashRefInflator.pm ;来自文档:

不执行列值膨胀,例如,使用像 DBIx::Class::InflateColumn::DateTime 这样的模块。返回的哈希包含原始数据库值。

因此,我想知道如何让该类为日期时间字段做一些特别的事情。

4

1 回答 1

4

您的时区可能是America/New_York,与-0500("EST") 不同,它遵循 DST。

出于这个原因,它不是一个适合存储的时区。每年有 120 分钟在这个时区的时间戳会不明确。因此,时间戳实际上存储在 UTC 中是有道理的。

如果您要使用DBIx::Class::InflateColumn::DateTime或者如果您从时间戳显式创建 DateTime 对象,则可以将这些时间戳转换为您的时区或任何其他时区。

您可以在使用模式生成器时指定一个选项,该选项将导致使用此模块(-o components='["InflateColumn::DateTime"]'for dbicdump)。

于 2012-12-12T16:29:54.587 回答