如何控制rails 4 datetime_local_field的输出?

时间:2014-12-31 22:21:08

标签: jquery ruby-on-rails datetime ruby-on-rails-4

我正在使用datetime_local_fieldjquery-datetimepicker-rails在表单中输入本地日期和时间。该视图包含:

<%= f.datetime_local_field :start, class: 'datetimepicker' %>

以日期和时间之间的格式包括“T”输出时间,例如。 2014-12-29T14:00:32。 JavaScript无法将其识别为有效时间戳,因此日期和时间不会传播到选择器中,而是使用当前时间戳。有没有办法让这个工作?有更好的方法吗?

我还尝试使用datetime_field并获得类似结果。

2 个答案:

答案 0 :(得分:2)

这是一种ISO8601日期格式,JS Date.parse理解这种格式。您应该覆盖此处所述的jquery-datetimepicker Date.parseDate方法:http://xdsoft.net/jqplugins/datetimepicker/#use_other_date_parser

答案 1 :(得分:1)

@ smathy的回答让我朝着正确的方向努力,让它至少尽可能地发挥作用。我需要做一些进一步的工作来实现这个目标。必须在init运行之前完成Date.parsedate的覆盖,并且它必须返回Date类型的对象。这导致以下代码:

//= require jquery.datetimepicker
Date.parseDate = function( input, format ){return new Date(Date.parse(input));};
jQuery(document).on('ready page:change', function() {
    var datetimefield = jQuery('.datetimepicker');
    datetimefield.datetimepicker({
        format: 'Y-m-d H:i:s',
        lang: datetimefield.attr('lang') || datetimefield.parents('[lang]').attr('lang')
    });
});

//=require jquery.datetimepicker/init已被gem中的实际init代码替换,并且覆盖已在它之前运行。

我不再使用f.datetime_local_field,而只使用f.datetime_field来防止时区被应用两次。

此代码在同一页面上使用多次时也存在问题。第一次访问早期字段时,它们会显示最后一个字段的时间戳。我正在寻找一个更好的日期时间选择器,如果找到一个,我会在这里报告。

编辑:2014年1月18日

我使用了Trent Richardson的jQuery timepicker https://github.com/trentrichardson/jQuery-Timepicker-Addon和browser-timezone-rails gem。时间在文本字段

中显示为格式化值
      <%= f.text_field :start_time, value: f.object.start_time.strftime('%F %T'), class: 'datetime' %>

以当地时间的一致但人类可读的格式。时间戳的JS配置是:

$(document).on("ready page:load", function() {
    $('.datetime').datetimepicker({
         dateFormat: $.datepicker.ISO_8601,
        separator: ' ',
        timeFormat: 'HH:mm:ss',
        showSecond: false,
        showMillisec: false,
        showMicrosec: false,
        showTimezone: false,
        pickerTimeFormat: 'hh:mm tt'
    });
});

on("ready page:load"是必需的,因为turbolinks并不会导致准备被解雇。此代码正确支持页面上的多个日期时间字段,但需要进行一些额外的验证。