moment.jsをお使いの皆さんにはisValid
関数があるじゃんとお思いでしょう。
dayjsはmoment.jsのAPIと高い互換性を持ちますがこの関数に関しては挙動が異なるみたいです。
dayjs('2020/02/31', 'YYYY/MM/DD').isValid() // true
moment('2020/02/31', 'YYYY/MM/DD').isValid() // false
dayjsではフォーマットが可能かどうかだけを判断してるみたいで、日付が存在するかは判定してない。
なので以下のようなメソッドを作ることで日付の存在をチェックできます。
const validate = (date, format) => {
return dayjs(date, format).format(format) === date;
}
validate('2020/02/31', 'YYYY/MM/DD') // false
なぜこれで判定ができるのかというと、dayjsはフォーマットを行うと2020/02/31
は2020/03/02
に変換されます。
なので、もとの値と比較してズレていると存在しない日付という判定が行えるということでした。