0

解決:

ruby エンドにはamerican_date ジェムを使用し、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 が返されます。日付が正しい場合、バリデータは合格しません。

エレガントなソリューションが必要です。

4

3 に答える 3

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)> 
于 2013-09-01T18:14:15.753 に答える
1

YYYY-MM-DD通常、データを2013-09-01の形式で保存して ruby​​ に送信します。

Date.parse("2013-09-01")
# => Sun, 01 Sep 2013

私は通常altField、jquery datepicker のプロパティを使用します。altField は、日付の YYYY-MM-DD 形式を格納するためにページに追加する隠しフィールドを参照する必要があります。その後、ルビーでは、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" />

datepicker の yy-mm-dd の altFormat は YYYY-MM-DD に変換されることに注意してください - http://api.jqueryui.com/datepicker/#utility-formatDate

dateFormatログオンしているユーザーのロケールに適した形式に設定する必要があります

于 2013-09-01T18:06:34.540 に答える
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)>
于 2013-09-01T12:43:34.793 に答える