Moment の isValid() が機能しない
【環境】
moment:2.9.0
moment:2.9.0
Moment.js
Moment.js Documentation
現象
公式ドキュメント:Moment.js Documentation
に
- moment("2010 13", "YYYY MM").isValid(); // false (not a real month)
こう書いてあるけど、月を3ケタにすると通っちゃう。
しかも挙動がマチマチ。
- // 根本的にフォーマットが違っているパターン
- moment( '2010 12', 'YYYY-MM' ).isValid() // true
- var date = moment( $( '#month' ).val() );
- var datem = date.format( 'YYYY-MM' ).toString(); // datem -> Invalid Date
- moment( '2010 99', 'YYYY-MM' ).isValid() // false
- moment( '2010 100', 'YYYY-MM' ).isValid() // true
- var date = moment( $( '#month' ).val() );
- var datem = date.format( 'YYYY-MM' ).toString(); // datem -> Invalid Date
- moment( '2010 129', 'YYYY-MM' ).isValid() // true
- var date = moment( $( '#month' ).val() );
- var datem = date.format( 'YYYY-MM' ).toString(); // datem -> Invalid Date
- moment( '2010 130', 'YYYY-MM' ).isValid() // false
- // フォーマットは正しいパターン
- moment( '2010-100', 'YYYY-MM' ).isValid() // true
- var date = moment( $( '#month' ).val() );
- var datem = date.format( 'YYYY-MM' ).toString(); // datem -> 2010-04
- var datem = date.format( 'YYYY-MM-DD' ).toString(); // datem -> 2010-04-10
- moment( '2010-101', 'YYYY-MM' ).isValid() // true
- var date = moment( $( '#month' ).val() );
- var datem = date.format( 'YYYY-MM' ).toString(); // datem -> 2010-04
- var datem = date.format( 'YYYY-MM-DD' ).toString(); // datem -> 2010-04-11
- moment( '2010-129', 'YYYY-MM' ).isValid() // true
- var date = moment( $( '#month' ).val() );
- var datem = date.format( 'YYYY-MM' ).toString(); // datem -> 2010-05
- var datem = date.format( 'YYYY-MM-DD' ).toString(); // datem -> 2010-05-09
- moment( '2010-130', 'YYYY-MM' ).isValid() // false
上記実験結果をまとめると
- 2ケタ月は 13~99 について false
- 3ケタ月は 100~129 について true、130~ false
- フォーマットが異なっているときは、moment オブジェクトとしては認めても、Invalid Date
- フォーマットが合っているときは、YYYY-DDD として、元日からの総合日数で年月日を算出している模様
ただし、130日以降は NG
面白くていくつか実験してみたけど、解決策があるので、この辺で。
解決策
というか正しい書式。
- moment('It is 2012-05-25', 'YYYY-MM-DD').isValid(); // true
- moment('It is 2012-05-25', 'YYYY-MM-DD', true).isValid(); // false
- moment('2012-05-25', 'YYYY-MM-DD', true).isValid(); // true
第3引数に true を入れると「真面目に」チェックしてくれるみたい。 😎
今のところは正常にバリデーションしてくれてます。
と思ったら嘘だった
と、思ったら、次の日、鯖に上げてみたら true が機能しない。
そして、あれ?っと思ってローカルで再び試したら機能していない。
???
むぅ。。。
困った