2013-08-06 21 views
0

我正在使用rail4應用程序。我想在UTC中的所有mysql表中存儲日期。但是,我將用戶的時區存儲在一個特定的表中,名爲users。當用戶登錄時,我從用戶的時區表user表中獲取並保存會話。Rails4:在用戶的時區保存並顯示日期

我可以在UTC的所有表格中保存日期,因爲config.time_zone的默認值是UTC,用於activerecords和activemodels。但是,顯示時我想在用戶的時區顯示日期。除此之外,當任何用戶以任何html格式輸入日期/時間時,我想將其保存爲等效的UTC格式。

達到此目的的最佳方法是什麼?

+0

另請參閱http://stackoverflow.com/questions/1048937/how-do-i-change-the-zone-offset-for-a-time-in-ruby-on-rails –

回答

1

的Rails,ActiveRecord的和MySQL將保存UTC的所有時間戳字段。沒有你必須做任何事情。

在您的application.rb文件中完成了應用程序的配置,如果要顯示時間戳的顯示時區與UTC不同,請定義默認時區。

因此

config.time_zone = 'Central Time (US & Canada)' 

將顯示時間戳字段(您無需做任何其他的代碼特殊),使用中部時間。

當您希望每個用戶在不同時區顯示時間戳時,可以將時區存儲在用戶數據旁邊的一列中。該列可以稱爲time_zone,並且可以包含用戶首選時區的字符串。

但是,您必須告訴timestamp對象將其自身顯示到特定的時區。這是在DateTime對象響應的方法in_time_zone(timezone)的幫助下完成的。

示例(當使用默認的時區爲UTC):

1.9.3-p194 :004 > d = DateTime.new(2012, 9, 1, 6, 30, 0) 
=> Sat, 01 Sep 2012 06:30:00 +0000 
1.9.3-p194 :005 > d.in_time_zone("Central Time (US & Canada)") 
=> Sat, 01 Sep 2012 01:30:00 CDT -05:00 

或者你可以在全球範圍內的手放在一個之前或周圍過濾器更改時區的請求。在互聯網上有一個文檔,如果你做了一個谷歌。

另請參閱這一個:http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html 爲解決問題的各種替代方案。

1

您可以使用UTC存儲時間,並分別存儲時區。時區通常以秒爲單位存儲爲UTC偏移量(秒爲SI單位時間)。

然後你就可以像這樣顯示的:

utime = Time.now.utc.to_i # this value can be any format that Time.at can understand. In this example I'll use a unix timestamp in UTC. Chances are any time format you store in your DB will work. 
=> 1375944780 

time = Time.at(utime) # parses the time value (by default, the local timezone is set, e.g. UTC+08:00) 
=> 2013-08-08 14:53:00 +0800 
time_in_brisbane = time.in_time_zone(ActiveSupport::TimeZone[36000]) # sets the timezone, in this case to UTC+10:00 (see http://stackoverflow.com/a/942865/72176) 
=> Thu, 08 Aug 2013 16:53:00 EST +10:00 
time_brisbane.strftime("%d %b %Y, %l:%M %p %z") # format with strftime however you like! 
=> "08 Aug 2013, 4:53 PM +1000" 
相關問題