解决方案:
我使用american_date gem作为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很难做到这一点。
irb:
2.0.0p247 :018 > Date.parse("11/02/2013")
=> Mon, 11 Feb 2013
javascript控制台
new Date("11/02/2013")
Sat Nov 02 2013 00:00:00 GMT+0100 (CET)
IRB:
2.0.0p247 :029 > Date.parse("11.02.2013")
=> Mon, 11 Feb 2013
javascript控制台
new Date("11.02.2013")
Sat Nov 02 2013 00:00:00 GMT+0100 (CET)
如果验证通过,我在数据库的日期字段中得到一个nil,并且 如果日期是ruby正确,则验证器不会通过。
我需要一个优雅的解决方案。
答案 0 :(得分:1)
通常,您希望以YYYY-MM-DD
格式存储数据并将数据发送到ruby,即2013-09-01
Date.parse("2013-09-01")
# => Sun, 01 Sep 2013
我通常使用jquery datepicker的altField
属性。 altField应引用您添加到页面的隐藏字段以存储日期的YYYY-MM-DD格式,然后在ruby中,您将忽略从datepicker输入字段发送的值。
示例:给定带有属性start_on
的rails model事件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" />
请注意,datepicker上yy-mm-dd的altFormat转换为YYYY-MM-DD - http://api.jqueryui.com/datepicker/#utility-formatDate
您需要将dateFormat
设置为登录用户区域设置的正确格式
答案 1 :(得分:1)
看一下gem american_date,它会让ruby将日期格式化为MM / DD / YYYY,就像在Gemfile
可以与gem install american_date
➜ ~ 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)
使用Date::strptime
,您可以指定日期格式。
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)>