为什么我的日期超出了某些日期的范围,但不是其他日期?

问题描述:

我在rails 4.0.9项目中使用了bootstrap-datepicker-rails(v.1.3.0.2),并在开发和生产中看到了一些奇怪的行为,如标题所解释的。我已经看过this question,但看起来我的问题与OP的不同,并且更奇怪。为什么我的日期超出了某些日期的范围,但不是其他日期?

和他一样,我发现了一个argument out of range错误,当我提出我的形式(无论是对于create动作或动作update),但仅限于某些日期,而不是为别人。

例如,这个日期是超出范围(复制从我的开发日志 - 从发送到控制器的参数片段):

"date_received"=>"08/28/2014" 

然而,这个日期是确定:

"date_received"=>"08/07/2014" 

我认为一些日期选择保存正确的规则排除了格式问题。我很难理解这会如何发生。在08/13/2014之前的任何日期都有效,并且之后的任何日期都会返回超出范围的错误。

这里是丑陋的细节:

的application.js:

//= require jquery 
//= require jquery.turbolinks 
//= require jquery.tablesorter 
//= require jquery_ujs 
//= require bootstrap 
//= require bootstrap-datepicker/core 
//= require jquery-ui 
//= require turbolinks 

application.css:

*= require jquery-ui/theme 
*= require bootstrap-datepicker 
*= require font-awesome 
*= require custom 
*= require theme.blue 
*= require_self 

jobs.js.coffee:

$(document).ready -> 

    $ -> 
    $(".tablesorter").tablesorter({sortList: [[2,0]]}) 
    $('.datepicker').datepicker() 

    return 

工作。 rb:

(验证所讨论的字段):

validates :date_received, presence: true 

jobs_controller.rb:

(行上发生错误):

if @job.update_attributes(job_params) 

job_params定义:

def job_params 
    params.require(:job).permit(:number, :name, :display_name, :date_received, :market, 
    :job_type, :pose_selection, :pose_selection_label, :pose_selection_deadline, 
    :pk_id, :pk, :flyout_id, :flyouts, :code, :tax_rate, :shipping_handling, :mail_home, 
    :mail_home_amount, :line, :notes, :entered, :entered_by, :verified, :verified_by, 
    :printed, :printed_by, :assembled_by, :shipped, :active, :discount_amount, :data) 
end 

我该从哪里出发t解决这个问题?

+0

日期格式问题?它是否假设为dd/mm/yy?你有没有试过20/08/14,这是考虑范围? – SteveTurczyn 2014-08-29 21:11:06

+0

我刚刚在手动输入日期而不是通过日期选择器来挑选日期。如果我输入日期“20140828”,它在范围内。 “20140807”也是如此。仍然不明白它是如何通过datepicker错误的。 – digijim 2014-08-29 21:13:39

+0

它变得更加怪异。从datepicker工作中选择的2014年9月开始的日期也可以。所以只是从2014年8月13日到2014年8月31日的日期失败。我尝试过的所有其他日期都有效。我需要一杯饮料。 – digijim 2014-08-29 21:40:04

bootstrap-datepicker-rails返回的日期的默认格式是“mm-dd-yyyy”。以这种方式提交格式化的日期不正确地保存日期​​,或者导致“超出范围”错误,因为Rails将当天误解为月份。 h/t给@SteveTurczyn打开我的眼睛,看看这个事实。

@AndrewMorton建议让bootstrap-datepicker-rails提交一个Date而不是String,但是没有这样的机制内置到那个gem中,AFAIK。

所以我需要改变由datepicker返回的字符串的格式。经过一些控制台测试后,我发现“dd-mm-yyyy”格式可以成功保存(当然还有其他格式)。

更改此行(来自jobs.js。咖啡):

$('.datepicker').datepicker() 

...这样的:

$('.datepicker').datepicker({ dateFormat: 'dd-mm-yy' }) 

迫使日回到了形式在 “DD-MM-YYYY” 的格式。

此修复程序唯一的缺点是,通过日期选择器选择日期后,表格上显示的日期未格式化为美国受众(例如“23-09-2014”而不是“09-23-2014” “)。但在所有其他视图中,我可以通过strftime转换显示美国格式。这是我为了简单而愿意做出的牺牲。至少在我没有更大的鱼来炒。

更新:这真是一个糟糕的'解决方案'。

经过太多搜索任何人的好,我遇到了this post这使用datepicker美国日期格式更好的工作。它有缺点(请参阅我对该帖子的评论),但会为我的目的工作。