Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 为什么我的约会超出了某些日期的范围,而不是其他日期?_Date_Ruby On Rails 4_Bootstrap Datepicker_Outofrangeexception - Fatal编程技术网

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

Date 为什么我的约会超出了某些日期的范围,而不是其他日期?,date,ruby-on-rails-4,bootstrap-datepicker,outofrangeexception,Date,Ruby On Rails 4,Bootstrap Datepicker,Outofrangeexception,我在rails 4.0.9项目中使用了bootstrap datepicker rails(v.1.3.0.2),并在开发和生产中看到了一些奇怪的行为,正如标题所解释的。我已经看过了,但我的问题似乎和OP的不一样,而且更奇怪 和他一样,当我提交表单时(无论是针对创建操作还是针对更新操作),我得到了一个超出范围的参数错误,但只针对某些日期,而不针对其他日期 例如,此日期超出范围(复制自我的开发日志-发送给控制器的参数的一个片段): 但这个日期是确定的: "date_received"=>"0

我在rails 4.0.9项目中使用了bootstrap datepicker rails(v.1.3.0.2),并在开发和生产中看到了一些奇怪的行为,正如标题所解释的。我已经看过了,但我的问题似乎和OP的不一样,而且更奇怪

和他一样,当我提交表单时(无论是针对
创建
操作还是针对
更新
操作),我得到了一个超出范围的
参数
错误,但只针对某些日期,而不针对其他日期

例如,此日期超出范围(复制自我的开发日志-发送给控制器的参数的一个片段):

但这个日期是确定的:

"date_received"=>"08/07/2014"
我认为一些日期选择正确保存的事实排除了格式问题。我不明白这是怎么发生的。2014年8月13日之前的任何日期均有效,之后的任何日期均返回超出范围的错误

以下是丑陋的细节:

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
$('.datepicker').datepicker()
job.rb:

(有关字段的验证):

jobs_controller.rb:

(发生错误的行):

作业参数定义:

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

从这里到哪里解决这个问题?

引导数据采集器rails返回的日期的默认格式是“mm-dd-yyyy”。提交以这种方式格式化的日期可能会错误地保存日期,或者导致“超出范围”错误,因为Rails将日期错误地理解为月份。感谢@SteveTurczyn让我看到了这个事实

@AndrewMorton建议让bootstrap datepicker rails提交一个日期,而不是一个字符串,但是这个gem中没有内置这样的机制,AFAIK

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

更改此行(来自jobs.js.coffee):

。。。为此:

$('.datepicker').datepicker( { dateFormat: 'dd-mm-yy' } )
强制返回表单的日期格式为“dd-mm-yyyy”

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

更新:这真是一个糟糕的“解决方案”


在对任何人的好处进行了太多的搜索之后,我发现了一种更适合使用datepicker和美国日期格式的方法。它有它的缺点(见我在文章中的评论),但对我的目的有效。

日期格式问题?是否假定为年月日?你试过2014年8月20日了吗?这算是一个范围吗?我刚才试过手动输入日期,而不是通过datepicker选择。如果我输入日期“20140828”,它在范围内。“20140807”也是如此。我还是不明白它是如何通过datepicker出错的。它变得更奇怪了。从2014年9月开始的日期也是通过datepicker work OK选择的。因此,只有2014年8月13日至2014年8月31日的日期失败了。我试过的所有其他约会都有效。我需要喝一杯。很明显,它正在以d/m/y格式(英国格式)读取字符串。任何大于12的“月”(中间)值都将失败。@digijim如果使用日期,则无论语言环境如何,该日期都是明确的。例如,2014年1月1日在世界大部分地区是2014年1月1日,但在少数地区(尤其是美国)是2014年1月1日。日期(2014,1,1)是明确的,因为它被指定为(年、月、日)。我不知道bootstrap datepicker rails的内部结构,但它确实应该允许使用日期而不是字符串。
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
$('.datepicker').datepicker()
$('.datepicker').datepicker( { dateFormat: 'dd-mm-yy' } )