日付が有効かどうかを確認してください


124

以下はシナリオです。

私が持っているString日付と異なる日付形式を。例:
日付:2016-10-19
dateFormat: "DD-MM-YYYY"。

この日付が有効かどうかを確認する必要があります。

次のことを試してみました

var d = moment("2016-10-19",dateFormat);

d.isValid()false毎回戻ってきます。Moment.jsは指定された形式で日付を解析しませんか?

それから私はDD-MM-YYYY最初に日付をフォーマットして、それをMoment.jsに渡そうとしました:

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

これdate.isValid()で望ましい結果が得られましたが、ここではMoment.js日付オブジェクトが2回作成されています。どうすればこれを回避できますか?より良い解決策はありますか?

ちなみに私は変更することはできませんdateFormat


dateFormatの値を変更することはできませんか?その場合、2016-10-19はDD-MM-YYYYではなくYYYY-MM-DDであるため、入力の形式を変更する必要があります。何を変更できますか?
Pochen

入力は日付ピッカーから送られます。それも変更できません:(
Ganesh

1
なぜあなたはdateFormat変数を変更することが許可されていないのですか?var d = moment( "19-10-2016"、 "DD-MM-YYYY"); 私に関する限り、あなたの問題を解決するでしょう
Pochen

本当に言えない。しかし、その値を変更することは私の支配下にありません。
ガネーシュ

回答:


185

解決策を見つけることができました。私が取得している日付はISO形式であるため、日付を指定するだけで検証され、dateFormatを渡す必要はありません。

var date = moment("2016-10-19");

そして、date.isValid()望ましい結果を与えます。


15
現在の好ましい方法が今何であるか誰か知っていますか?このメソッドは、次の「非推奨警告」をスローするようになりました:構築がjs Dateにフォールバックする瞬間。これはお勧めできません。今後のメジャーリリースで削除される予定です。詳細については、github.com / moment / moment / issues / 1407を参照してください。
Andrew


4
これは常に機能var a = moment('12345'); a.isValid() // is trueするとは限らないことに注意してください。日付を解析できない場合、モーメントはデフォルトの日付オブジェクトにフォールバックするため、これは失敗します。また、デフォルトの日付オブジェクトは常に日付を返します(希望する日付ではありません)
Mauvis Ledford

1
それを追加する必要があるmoment('02').isValid() === trueので、注意する必要があるかもしれません
Bruno Finger

3
またmoment('abcde 1').isValid() === true
Amiram Korach

119

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

呼び出し時にmoment、厳密な解析を強制する3番目の引数を追加する必要があります。これは、瞬間のドキュメントの関連部分ですhttp://momentjs.com/docs/#/parsing/string-format/これは、セクションの終わり近くにあります。


これは効果がありません。
Billal Begueradj

この答えは正しい答えである必要があります........ @ Begueradjこれは効果があります。別の値を使用してみてください。時には正しく、時には間違っています
Akki

厳密な解析については、こちらをご覧ください
kuhr

これにより、年として0000を入力できます

17

ここに行きます:作業フィドル

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

先ほど言ったように、dateFormatは「DD-MM-YYYY」であり、変更することはできません。
ガネーシュ

ああなるほど。それについて見てみましょう。
gschambial 2016年

ここで日付文字列を変更することはできます2016-10-19か?
gschambial

いいえ。それは日付ピッカーから来ています
ガネーシュ

1
日付ピッカーから取得した後、入力する前に変更できませんvar d = moment("2016-10-19",dateFormat);か?
gschambial

14

undefinedデータ値のケースを処理するために、新しい日付とともにモーメントを使用します。

const date = moment(new Date("2016-10-19"));

のため: moment(undefined).isValid() == true

ここでより良い方法として: moment(new Date(undefined)).isValid() == false



8

日付と日付の形式が異なる場合に、モーメントを使用して文字列が有効な日付かどうかを確認する方法

申し訳ありませんが、このスレッドで指定された解決策のいずれかが、実際に尋ねられた質問に答えましたか?

文字列の日付と異なる日付形式があります。例:日付:2016-10-19 dateFormat: "DD-MM-YYYY"。この日付が有効かどうかを確認する必要があります。

次は私のために働きます...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

しかし正直なところ、moment.isDate()ドキュメントに記載されているように)オブジェクトしか受け入れない理由がわかりません。私の意見では文字列もサポートする必要があります。


1
瞬間的に3番目の引数としてtrueを渡すと、正確な日付形式をチェックします。
Raj Kumar N

2
console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())

 moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
 moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
 moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
 moment('undefined', 'YYYY-DD-MM').isValid()?  false

回答に説明を追加していただけませんか?これは、既存の受け入れられた回答にどのような付加価値をもたらしますか?
slfan

0

日付が有効な場合、getTime()は常にそれ自体と等しくなります。

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}

-2

これを試してみてください。それは良いことではありませんが、入力が日付ピッカーからの一定の形式である限り機能します。

この例では、ピッカーからのbadDateです。

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}

1
これを行わないでください。
tdelam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.