【问题标题】:Wrong date saved to database保存到数据库的日期错误
【发布时间】:2013-10-08 21:30:49
【问题描述】:

我正在尝试将日期保存到数据库中,但我无法正确设置。日期总是在实际日期后 4 小时。我正在使用 FullCalendar 来显示事件。

我这样保存日期:

var dateEnd = new Date();
            dateEnd.setDate(day);
            dateEnd.setMonth(month);
            dateEnd.setFullYear(year);
            dateEnd.setHours(hour);
            dateEnd.setMinutes(minutes);

            alert('Next slot: ' + dateEnd);


            $('#calendar').fullCalendar('renderEvent', { title: 'YOUR TITLE', start: date, end: dateEnd,allDay: false, backgroundColor: '#378006' }, true );

            $.ajax({
              type: "POST",
              url: "/create",
              data: {
                start_date: date,
                end_date: dateEnd,
                doctor_id: '1',
                user_id: '1'
              }
            });

我这样显示事件:

events: 
        [
        <% @appointments.each do |appointment| %>
        {
          //alert(<%= appointment.start_date %>);
          title  : "Reserved",
          start  : "<%= appointment.start_date.strftime '%Y-%m-%dT%H:%M:%S' %>",
          end    : "<%= appointment.end_date.strftime '%Y-%m-%dT%H:%M:%S' %>",
          allDay : false
        },
        <% end %>
        ],

我把它放在 application.rb 中,就像在这个线程 Different date saved to database - wrong time zone 中一样,但它仍然是一样的:

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

数据库中的日期总是提前 4 小时,当我从数据库中取回日期时,它们在 FullCalendar 上显示不正确。

【问题讨论】:

  • 听起来像是时区问题。您的数据库认为是哪个时区?你的代码认为它是什么?
  • 我的数据库以 UTC 时区保存所有内容。我目前在纽约,如果我在上午 10 点创建一个活动,它将像下午 2 点一样保存到数据库中。所以,相差 4 小时。
  • 我想我找到了解决方案。似乎它不想自动转换,所以在我需要输入“in_time_zone”的日期之后,它会正常将其转换为指定的时区。

标签: ruby-on-rails ruby date activerecord fullcalendar


【解决方案1】:

您的数据操作应该发生在您的控制器中,而不是您的视图中。视图应该只吐出预处理的值。

我建议将您的 @appointments 映射到它们的 :start:end 字符串等效项,作为哈希数组或数组数组。

【讨论】:

    【解决方案2】:

    我不认为你真的想要config.active_record.time_zone_aware_attributes = false。这告诉 rails 您不希望时间以 'Central Time (US &amp; Canada)' 表示,而是希望它们以 UTC 表示。

    【讨论】:

    • 我删除了那行,但它仍然是一样的。数据库增加了额外的 4 小时。
    • 我想我找到了解决方案。似乎它不想自动转换,所以在我需要输入“in_time_zone”的日期之后,它会正常将其转换为指定的时区。
    【解决方案3】:

    目前的解决方案:

    应用程序.rb:

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

    当我显示事件时,我会为每个日期添加“in_time_zone”:

            events: 
            [
            <% @appointments.each do |appointment| %>
            {
              title  : "Reserved",
              start  : "<%= appointment.start_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
              end    : "<%= appointment.end_date.in_time_zone.strftime '%Y-%m-%dT%H:%M:%S' %>",
              allDay : false
            },
            <% end %>
            ]
    

    这会自动将 UTC 格式的数据库中的日期转换为指定的时区。

    【讨论】:

    • 您的数据操作应该发生在您的控制器中,而不是您的视图中。视图应该只吐出预处理的值。
    • 我知道,但我无法让它在我的控制器中工作。你建议在控制器中做什么?谢谢。
    • 我建议将您的 @appointments 映射到它们的 :start:end 字符串等效项,作为哈希数组或数组数组。
    • @theTinMan - 如果需要,您可以发布您的解决方案,我可以将其标记为已接受的答案 :)
    • 我将其添加为答案。谢谢。
    猜你喜欢
    • 2013-09-17
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多