错误的日期保存到数据库

时间:2013-10-08 21:30:50

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

我正在尝试将日期保存到数据库但我无法做到正确。日期是实际日期后的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上显示不正确。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

现在的解决方案:

application.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格式的数据库转换为指定的时区。

答案 2 :(得分:0)

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

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