Ruby Date.parse和Javascript new Date()不接受相同的格式

Ruby Date.parse和Javascript new Date()不接受相同的格式,javascript,jquery,ruby-on-rails,ruby,jquery-ui,Javascript,Jquery,Ruby On Rails,Ruby,Jquery Ui,解决方案: 我在ruby端使用了,在js验证中使用了这个正则表达式 /^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[

解决方案:

我在ruby端使用了,在js验证中使用了这个正则表达式

/^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/.test(value)
问题

我在日期字段上使用jquery datepicker,用户可以键入日期

我希望我的应用程序中的用户能够选择自己的日期格式。他们可以选择美国格式mm/dd/yy或欧洲格式dd.mm.yy

我使用的是javascript格式验证程序。像这样

!/Invalid|NaN/.test(new Date(value).toString());
(我真的很喜欢不使用正则表达式的想法)

遗憾的是,Ruby和javascript让这变得很难

内部评级:

javascript控制台

new Date("11/02/2013")
Sat Nov 02 2013 00:00:00 GMT+0100 (CET)
new Date("11.02.2013")
Sat Nov 02 2013 00:00:00 GMT+0100 (CET)
内部评级:

javascript控制台

new Date("11/02/2013")
Sat Nov 02 2013 00:00:00 GMT+0100 (CET)
new Date("11.02.2013")
Sat Nov 02 2013 00:00:00 GMT+0100 (CET)
如果验证通过,我在数据库的日期字段中得到一个nil,并且 如果日期正确,则验证程序不会通过

我需要一个优雅的解决方案

使用,可以指定日期格式

Date.parse("11/02/2013")
# => #<Date: 2013-02-11 ((2456335j,0s,0n),+0s,2299161j)>
Date.strptime("11/02/2013", '%m/%d/%Y')
# => #<Date: 2013-11-02 ((2456599j,0s,0n),+0s,2299161j)>
Date.parse(“11/02/2013”)
# => #
日期.strtime(“2013年2月11日,'%m/%d/%Y')
# => #

通常您希望以
YYYY-MM-DD
格式存储数据并将其发送到ruby,即2013-09-01

Date.parse("2013-09-01")
# => Sun, 01 Sep 2013
我通常使用jquery日期选择器的
altField
属性。altField应该引用添加到页面中的隐藏字段来存储日期的YYYY-MM-DD格式,然后在ruby中忽略从datepicker输入字段发送的值

示例:给定属性start_为on的rails模型事件

jQuery(document).ready(function() {

  // initialize the datepicker input field
  jQuery('#date_picker_start_on').datepicker({
    "altField":"#event_start_on",
    "altFormat":"yy-mm-dd",
    "dateFormat":"m/d/yy"
  }); 

  // this is need to work around a defect in datepicker altField handling
  jQuery('#date_picker_start_on').change(function() { 
    if (!$(this).val()) { 
      // clear the hidden field if datepicker cleared          
      jQuery('#event_start_on').val(''); 
    } 
  });

});

// assuming the markup of the hidden field something like
<input id="event_start_on" name="event[start_on]" type="hidden" />
jQuery(文档).ready(函数(){
//初始化datepicker输入字段
jQuery(“#日期_选取器_开始_开启”)。日期选取器({
“altField”:“事件开始”,
“altFormat”:“yy-mm-dd”,
“日期格式”:“m/d/yy”
}); 
//这需要解决datepicker altField处理中的缺陷
jQuery('#date_picker_start_on').change(function(){
如果(!$(this.val()){
//如果清除了日期选择器,则清除隐藏字段
jQuery('event#start_on').val('');
} 
});
});
//假设隐藏字段的标记类似于
请注意,日期选择器上的yy-mm-dd格式转换为YYYY-mm-dd-

您需要将
dateFormat
设置为登录用户区域设置的正确格式

看看gem,它将允许ruby获取格式为MM/DD/YYYY的日期,只需在
Gemfile
中添加一行即可

可与
gem安装日期一起安装

➜  ~  irb                      
2.0.0p0 :001 > require 'american_date'
=> true 
2.0.0p0 :002 > Date.parse('11/02/2013')
=> #<Date: 2013-11-02 ((2456599j,0s,0n),+0s,2299161j)> 
➜  ~  内部评级
2.0.0p0:001>要求“美国日期”
=>正确
2.0.0p0:002>日期解析('11/02/2013')
=> # 

谢谢!问题不在于如何获得正确的日期格式,而在于如何让js和rouby一起交谈。当用户输入2013年2月11日时,我希望js和ruby都将其理解为2013年2月11日,当用户输入2013年2月11日时,is应输入为2 Now 2013。@AndreasLyngstad您希望js或ruby猜测正确的时间格式吗?也许你可以使用正则表达式?谢谢,这是一个很好的答案。我一直在走这条路。我有很多日期字段,很快就变得一团糟。我想我会选择美式约会宝石。