【问题标题】:Correctly storing dates with TimeZone in MySQL DB for a Rails application在 MySQL 数据库中为 Rails 应用程序正确存储带有 TimeZone 的日期
【发布时间】:2009-06-01 15:11:46
【问题描述】:

我正在考虑将我们的 Rails 2.3 应用程序转换为正确处理时区(目前一切都是 UTC,这是不对的,但 很方便!)。

我在 environment.rb 中有这些设置:

config.active_record.default_timezone = :utc
config.time_zone = "UTC"

接下来,对于我们应用程序中的每个请求,我计划进行以下设置来设置时区:

Time.zone = user.time_zone

user.time_zone 是他们选择的偏好(例如US Pacific Time)。

这在应用程序中运行良好,但我的问题与 Rails 然后存储在 MySQL 数据库中的内容有关。如果用户选择 2009 年 6 月 1 日的日期,则会以 UTC 格式将其存储在数据库中的 DATETIME 字段中,但带有时区偏移量。例如,如果用户选择了GMT+6 时区,则选择的日期 2009 年 6 月 1 日最终在数据库中为2009-06-01 06:00:00 UTC

我希望这会以2009-06-01 00:00:00 UTC 的形式存储在数据库中。我的想法是正确的还是 Rails 在这里做了一些意想不到的事情?

【问题讨论】:

  • 您只需要在用户的时区显示日期,还是将其专门存储在该时区中很重要?
  • Chris 我想将它存储在 UTC 中,并且只显示用户所在时区的日期

标签: mysql ruby-on-rails date time timezone


【解决方案1】:

这篇博文讨论了 Rails 2.1+ 中的本地时区处理:

http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/

要点是Rails 将以UTC 格式将所有记录存储在数据库中,然后转换为用户时区进行显示。这是有道理的:以中性形式存储所有数据,然后在最后一刻将其转换为所需的形式。

【讨论】:

  • 博客在哪里?
【解决方案2】:

根据您对我的评论的回复,我想说只是根据本地服务器时间存储日期,然后使用 JavaScript 的 Date::toLocaleString() 将其转换为本地时区。几年前我写了一篇关于它的文章,你可以找到here

这篇文章的 JS 是用 MooTools 编写的,但后来我用 jQuery 重写了它,所以我将展示这段代码。

重要部分:

渲染为 HTML 时,使用自 Epoch 以来的毫秒数。

<span class="dt"><!-- <%= blah.created_at_epoch_ms %> --><%= blah.created_at %></span>

这需要在您的模型中定义如下方法:

def created_at_epoch_ms
    self.created_at.to_i * 1000
end

转换日期的JS:

$(document).ready(function(){
        $('span.dt').each(function(){
                var date = new Date();

                date.setTime(this.firstChild.data);

                $(this).parent().text(date.toLocaleString());
        });
});

这应该将字符串转换为用户的本地时间,而魔法发生在 toLocaleString() 中。我听说的唯一一个没有实现它的浏览器是 Safari 2.0,它应该不会带来太大的问题,因为我认为大多数用户已经开始使用它。

我在my site 上使用了这个方法,如果你查看页面的源代码,你可以看到它的作用。发送到浏览器的实际代码如下所示:

<!-- 1243484521000 -->2009-05-28 04:22:01 UTC

在我的浏览器(中部时间)中转换为

Wednesday, May 27, 2009 11:22:01 PM

如果他们启用了 JS,它将获取评论节点的值,对其进行转换,并将整个字符串(包括 UTC 时间)替换为本地时间。如果 JS 被禁用,他们只会看到服务器看到的时间。

【讨论】:

    【解决方案3】:

    您需要在设置日期之前在数据对象中设置时区。

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多