web-dev-qa-db-ja.com

文字列が有効な日付であるか、モーメントを使用していないことをテストする方法は?

入力した日付または時刻が有効かどうかをテストしたいと思います。

Javascriptを使用した日付と時刻のテストが悪夢のように思えるので、これをすぐに行うことができます。 (これに何時間も費やしました)。

テストデータは次のようになります。

無効

invalid = ""
invalid = " "
invalid = "x"
invalid = "1/1"
invalid = "30/2/2015"
invalid = "2/30/2015"

有効

isvalid = "1/12/2015"
isvalid = "1/12/2015 1:00 PM";

さまざまなJavaScriptメソッドを試してみましたが、何時間もの試行錯誤に失敗しました。

私はこの瞬間に何かがあると思った。だから、次のことを試してみましたが、このような瞬間は動作しないと思うので、すべては動作しません。

var valid = moment(input).isDate()
var valid = moment().isDate(input)

私の時間形式は「dd/mm/yyyy」です

38
Valamas

はい、momentjsを使用して解析し、文字列と比較できます

function isValidDate(str) {
  var d = moment(str,'D/M/YYYY');
  if(d == null || !d.isValid()) return false;

  return str.indexOf(d.format('D/M/YYYY')) >= 0 
      || str.indexOf(d.format('DD/MM/YYYY')) >= 0
      || str.indexOf(d.format('D/M/YY')) >= 0 
      || str.indexOf(d.format('DD/MM/YY')) >= 0;
}

テストコード

tests = ['',' ','x','1/1','1/12/2015','1/12/2015 1:00 PM']
for(var z in tests) {
  var test = tests[z];
  console.log('"' + test + '" ' + isValidDate(test));
}

出力

 "" false
 " " false
 "x" false
 "1/1" false
 "1/12/2015" true
 "1/12/2015 1:00 PM" true
34
Kokizzu

Momentには isValid という関数があります。

この関数をターゲット日付形式およびstrict解析パラメーターとともにtrue(そうでない場合、検証に一貫性がない可能性があります)必要なすべてのチェック(うるう年など)をライブラリに委任するには:

var dateFormat = "DD/MM/YYYY";
moment("28/02/2011", dateFormat, true).isValid(); // return true
moment("29/02/2011", dateFormat, true).isValid(); // return false: February 29th of 2011 does not exist, because 2011 is not a leap year
96
Luca Fagioli