2013-08-30 85 views
4

我有一個事件的Rails應用程序。我的活動表有一個名爲start_date的字段,它是datetime類型的字段。目前,當我使用慢速保存事件來解析start_date字段時,日期被錯誤地存儲(或者至少返回錯誤)。在datetime上的時區導軌問題

例如:我保存了一個事件,並在start_date的文本字段中輸入了9/14/13 at 9am。它保存了數據,刷新了頁面,文本框中的值爲9/14/13 at 11am。 mysql表中的值是2013-09-14 16:00:00

這是怎麼回事?這隻發生在我的服務器上,而不是在本地運行。

application.rb中:

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

型號/ event.rb:

class Event < ActiveRecord::Base 
    belongs_to :user 
    attr_accessible :description, :name, :start_date_string 

    validate :name_not_blank 
    validate :start_date_not_blank 

    # Validate that the name is not blank 
    def name_not_blank 
     errors.add(:name, "Name can't be blank") unless !name.blank? 
    end 

    # Validate that the name is not blank 
    def start_date_not_blank 
     errors.add(:start_date, "Date and Time can't be blank") unless !start_date.blank? 
    end 

    # getter 
    def start_date_string 
     @start_date_string || start_date.in_time_zone.try(:strftime, "%m/%d/%Y at %I:%M %P") 
    end 

    # setter 
    def start_date_string=(value) 
     @start_date_string = value 
     self.start_date = parse_start_date 
    end 

    # parse the start_date 
    def parse_start_date 
     Chronic.parse(start_date_string) 
    end  
end 

助手/ application_helper.rb:

# Formats a date to words (i.e. March 20, 1980 at 10:00 am) 
def spell_date_and_time(date) 
    date.strftime("%B %d, %Y at %I:%M %P") 
end 

edit.html.erb

<span class="timestamp"><%= spell_date_and_time(event.start_date) %></span> 
+0

順便說一句,真的沒有必要'parse_start_date',你可以有'start_date_string'制定者。如果您使用的是文本字段,還可以查看無時間值和空白時間值。 – montrealmike

回答

3
添加此

假設'Central Time (US & Canada)'是正確的(即你不在東部時區),那麼:

> Time.zone = "UTC" 
> Chronic.time_class = Time.zone 
> Chronic.parse("June 15 2006 at 5:45 AM") 
=> Thu, 15 Jun 2006 05:45:00 UTC +00:00 

你可以把Chronic.time_class = Time.zoneconfig/initializers/chronic.rb

+0

設置chronic.time_class訣竅。非常感謝。 – Catfish

0

對不起,我在平板電腦上,所以這將不得不簡短。我有這樣的問題,並糾正它使用類似

Time.now.utc 

我看到你在application.rb中config.time_zone擁有的,所以這可能無法正常工作。

如果沒有,這裏是一個很好的SO回答,也許這將有助於

Why doesn't `config.time_zone` seem to do anything?

0

我同樣的問題,解決它在application.rb-

config.time_zone = 'Central Time (US & Canada)' 
config.active_record.default_timezone = :local 
+0

這似乎保存了當前時區的記錄(例如,我將它保存爲上午8:00,並且在上午8:00在數據庫中)。由於某些原因,在我的應用程序中查看時仍然顯示上午10點。 – Catfish

0

我有同樣的問題,我只是在我的application.rb中評論這條線固定它:

config.active_record.default_timezone = :local 

我這個根據我在讀application.rb中做:

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.