2009-06-01 8 views
5

我正在寻找转换我们的Rails 2.3应用程序来正确处理时区(目前一切都在UTC这是不正确的,但方便! )。正确存储MySQL数据库中的TimeZone日期为一个Rails应用程序

我在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日的日期,则将其存储在数据库中的DATETIME字段中,但以时区偏移量存储在数据库中。例如,如果用户选择了GMT+6时区,则2009年6月1日的选定日期以2009-06-01 06:00:00 UTC结尾于数据库中。

我本以为这将被存储为2009-06-01 00:00:00 UTC在数据库中。我的想法是正确的还是Rails在这里做了一些意想不到的事

+0

您是否需要在用户的时区中显示日期,或者是否需要将其专门存储在该时区中? – 2009-06-01 15:17:53

+0

Chris 我想以UTC格式存储它,并且只显示用户时区中的日期 – Olly 2009-06-02 09:19:04

回答

4

关于Rails的本地时区处理2.1+本博客文章会谈:

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

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

0

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

1

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

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

的重要部分:

当渲染HTML,使用,因为时代的毫秒。

<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被禁用,他们只会看到服务器看到它的时间。

相关问题