我有一个带有事件的 rails 应用程序。我的事件表有一个名为 start_date 的字段,它是日期时间类型。目前,当我使用chronic 保存事件来解析start_date 字段时,日期被错误地存储(或至少错误地返回)。

示例:我保存了一个事件,并在 start_date 的文本字段中输入了 9/14/13 at 9am 。它保存了数据,刷新了页面,文本字段中的值为 9/14/13 at 11am 。 mysql 表中的值为 2013-09-14 16:00:00

这里发生了什么?这只发生在我的服务器上,而不是在本地运行时发生。

应用程序.rb:

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

模型/事件.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

编辑.html.erb
<span class="timestamp"><%= spell_date_and_time(event.start_date) %></span>

最佳答案

假设 'Central Time (US & Canada)' 是正确的(即您不在东部时区),那么:

  • 你不需要 in_time_zone ,rails 会用当前的 Time.zone 为你做这件事
  • 您需要设置 Chronic 以将您的时区与 Chronic.time_class (by default, the built in Ruby time class creates times in your system's local time zone.)
  • 一起使用



    您可以将 Chronic.time_class = Time.zone 放在 config/initializers/chronic.rb

    关于mysql - Rails 在日期时间上的时区问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18524195/

    10-09 15:30