2011-08-22 200 views
1

我在「application.rb中」和restartet的WEBrick Web服務器的「重偏移」(耙分貝降遷移耙分貝)設置保存日期時間到數據庫::時區錯誤

config.time_zone = 'Berlin' 
config.active_record.default_timezone = :local 

如果我在數據庫的檢查條目,一切都很好,和「created_at」被正確地保存在我的Localtimezone:

sqlite> select created_at from docversions; 
2011-08-22 23:27:51.138723 
sqlite> 

但在這種情況下,這種「本地時區」不工作:

(creat.html.erb)

<%= form_for :token, :url => {:action => "save_token"}, :docversion_id => params[:id] do |f| %> 
<%= f.datetime_select :validuntil, :order => [:day, :month, :year, :hour, :minute], :default => 3.days.from_now, %> 
<%= f.submit %> 

(tokenadmin_controller.rb)

class TokenadminController < ApplicationController 
    def save_token 
    @token = Token.new 
    civildate = DateTime.civil(params[:token]["validuntil(1i)"].to_i, 
           params[:token]["validuntil(2i)"].to_i, 
           params[:token]["validuntil(3i)"].to_i, 
           params[:token]["validuntil(4i)"].to_i, 
           params[:token]["validuntil(5i)"].to_i) 
    @token.validuntil = civildate 
    if @token.save 
     flash[:notice] = "Token created." 
     redirect_to :controller => :tokenadmin, :action => :admin 
    else 
     flash[:error] = "Token could not be saved!" 
     redirect_to :controller => "index" 
    end 
    end 
end 

它似乎將被保存爲UTC:

sqlite> select validuntil, created_at from tokens; 
2011-08-22 01:44:00.000000|2011-08-22 23:44:20.640434 
sqlite> 

正如你所看到的,created_at正確保存的當地時間,但validuntil保存+ 2H(但我選擇了時間相同create_at ;-))。我認爲它的+ 2h因爲在UTC + 1和DST UTC + 2的時區。目前在DST。

這是一個錯誤,還是我做錯了什麼?

感謝您的幫助。

更新後職位從 「BaronVonBraun」:

謝謝!它的工作現在。 Databasefield仍然是 「時間戳」:

t.timestamp :validuntil 

控制器代碼,至極是用於創建時間字段:

前:

civildate = DateTime.civil(params[:token]["validuntil(1i)"].to_i, 
          params[:token]["validuntil(2i)"].to_i, 
          params[:token]["validuntil(3i)"].to_i, 
          params[:token]["validuntil(4i)"].to_i, 
          params[:token]["validuntil(5i)"].to_i) 

後:

civildate = Time.parse("#{params[:token]["validuntil(1i)"].to_s}-#{params[:token]["validuntil(2i)"].to_s}-#{params[:token]["validuntil(3i)"].to_s} #{params[:token]["validuntil(4i)"].to_s}:#{params[:token]["validuntil(5i)"].to_s}") 

回答

3

DateTime對象默認爲GMT/UTC(+0000偏移量)。

如果你想存儲你的本地時區以及你的日期對象,我建議使用Time而不是DateTime,它應該使用你在Rails配置中設置的時區。

如果您需要繼續使用DateTime,以下是另一個問題的答案:How do I alter the timezone of a DateTime in Ruby?。但是,在該解決方案中,它將時區設置爲硬偏移量,這意味着它不會處理進出DST的時間。

相關問題