web-dev-qa-db-ja.com

Moment JSを使用して時間を検証する方法はありますか?

Moment JSを使用して、時間として渡された文字列が有効かどうかを検証する方法はありますか?

操作moment("2014-12-13 asdasd","YYYY-MM-DD LT").isValid()またはmoment("asdasd","LT").isValid()trueと同等であり、理想的には発生しないはずです。

私のアプリケーションは複数の言語を使用しており、文字列を検証するための正規表現パターンを思いつくことは実際には不可能です。たとえば、時間文字列を"午前12時12分0秒"として取得した場合、MomentJSはこれを検証できるはずです。ソースをチェックしたところ、ライブラリでは時間チェックはそれほど厳密ではないことがわかりました。私は何かを逃したかもしれません。助けてください。

14
Chiranjib

説明されているように ドキュメントで 、瞬間2.3.0の時点で、「厳密な解析」モードをオンにする3番目のパラメーターtrueを渡すことができます。

moment("2014-12-13 asdasd","YYYY-MM-DD LT", true).isValid()   // false

moment("2014-12-13 12:34 PM","YYYY-MM-DD LT", true).isValid()   // true

欠点は、ロケールの形式(つまり、2番目の引数として指定された形式)と正確に一致する必要があることです。 LTは英語のh:mm Aと同等であるため、秒なしで12時間のみを受け入れます。 24時間制、または秒制を通過すると、失敗します。

moment("2014-12-13 12:34:00 PM","YYYY-MM-DD LT", true).isValid()   // false
moment("2014-12-13 15:00","YYYY-MM-DD LT", true).isValid()         // false

より良い解決策は、厳密な解析で複数の形式を渡すことです。

var formats = ["YYYY-MM-DD LT","YYYY-MM-DD h:mm:ss A","YYYY-MM-DD HH:mm:ss","YYYY-MM-DD HH:mm"];
moment("2014-12-13 12:34 PM", formats, true).isValid()     // true
moment("2014-12-13 15:00", formats, true).isValid()        // true
moment("2014-12-13 12:34:00 PM", formats, true).isValid()  // true
31
const allPossibleFormats = [
  'D MMMM YYYY',
  'D MMMM YYYY HH:mm',
  'DD-MM-YY',
  'DD-MM-YYYY',
  'DD.MM.YYYY',
  'DD.MM.YYYY HH:mm',
  'DD/MM/YY',
  'DD/MM/YYYY',
  'DD/MM/YYYY HH:mm:ss',
  'HH:mm:ss',
  'M/D/YYYY',
  'D/M/YYYY',
  'MM-DD-YY',
  'MM-DD-YYYY',
  'MM-DD-YYYY HH:mm:ss',
  'MM/DD/YY',
  'MM/DD/YYYY',
  'MM/DD/YYYY HH:mm:ss',
  'MMM D YYYY',
  'MMM D YYYY LT',
  'MMMM Do YYYY',
  'MMMM Do YYYY LT',
  'YYYY-DD-MM HH:mm:ss',
  'YYYY-MM',
  'YYYY-MM-DD',
  'YYYY-MM-DD HH:mm',
  'YYYY-MM-DD HH:mm:ss',
  'YYYY-MM-DD LT',
  'YYYY-MM-DD h:mm:ss A',
  'YYYY-MM-DDTHH:mm:ssZ',
  'ddd, MMM D YYYY LT',
  'dddd D MMMM YYYY HH:mm',
  'dddd, MMMM Do YYYY LT'
];

moment('Chicago Illinois 46702', allPossibleFormats, true).isValid(); // false
moment('18/01/1944', allPossibleFormats, true).isValid(); // true
moment('22-10-2020', allPossibleFormats, true).isValid(); // true
moment('1944-01-18 12:00:00', allPossibleFormats, true).isValid(); // true
moment('2001-01-01 00:00:00', allPossibleFormats, true).isValid(); // true
moment('2001-01', allPossibleFormats, true).isValid(); // true
<script src="https://momentjs.com/downloads/moment.js"></script>
0
аlex dykyі