2011-08-22 3 views
1

은 내가 "application.rb"와 restartet에 WEBrick 웹 서버에 "remigrated"(레이크 DB 드롭 마이그레이션 레이크 dB)에 저장 날짜 시간 : 시간대 오류

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가 제대로의 현지로 저장되지만 + 2 시간이 (하지만 난 같은 시간 등을 선택 validuntil 저장됩니다 create_at ;-)). 나는 UTC + 1과 DST UTC + 2에있는 시간대에 있기 때문에 +2h라고 생각합니다. 그리고 현재 DST에있었습니다.

버그입니까? 아니면 잘못된 것이 있습니까?

도움 주셔서 감사합니다. "BaronVonBraun"FROM POST AFTER

UPDATE :

감사합니다! 그 지금 일하고있어. 느릅 나무는 시간 필드를 만드는 데 사용하는 것입니다

t.timestamp :validuntil 

컨트롤러 코드 : Databasefield는 "타임 스탬프"아직

전 :

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 오프셋)입니다.

날짜 개체와 함께 현지 표준 시간대를 저장하려면 DateTime 대신 Time을 사용하는 것이 좋습니다. 이는 레일스 구성에서 설정 한 시간대를 사용해야합니다.

DateTime을 계속 사용해야하는 경우 여기에 다른 질문에 대한 답변이 있습니다 : How do I alter the timezone of a DateTime in Ruby?. 그러나이 솔루션에서는 시간대를 하드 오프셋으로 설정합니다. 즉, DST의 출입을 처리하지 못합니다.