【问题标题】:Ruby Date.parse and Javascript new Date() does not accept same formatsRuby Date.parse 和 Javascript new Date() 不接受相同的格式
【发布时间】:2013-09-01 12:38:54
【问题描述】:

解决方案:

我将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,并且 如果日期是正确的,则验证器不会通过。

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

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby jquery-ui


    【解决方案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】:

      通常您希望以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 模型事件

      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" />
      

      请注意,日期选择器上 yy-mm-dd 的 altFormat 转换为 YYYY-MM-DD - http://api.jqueryui.com/datepicker/#utility-formatDate

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

      【讨论】:

      • 谢谢,这是一个很好的答案。我一直走这条路。我有很多日期字段,很快就变得一团糟。我想我会选择 American_date gem。
      【解决方案3】:

      使用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)>
      

      【讨论】:

      • 谢谢!问题不在于如何得到正确的日期格式,而是让 js 和 rouby 一起说话。当用户输入 11.02.2013 时,我希望 js 和 ruby​​ 都将其理解为 2013 年 2 月 11 日,当用户输入 2013 年 2 月 11 日时,应该输入 2 Now 2013。
      • @AndreasLyngstad 你要 js 还是 ruby​​ 猜出正确的时间格式?也许你可以使用正则表达式?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多