Ribbit's works

日付の妥当性をチェックするワンライナー【JavaScript】

#JavaScript #TypeScript
にメンテナンス済み
記事のトップ画像

特定の文字列が日付として妥当かをチェックするコードです。

日付として処理できる形かをチェックしているだけで、yyyy-MM-dd などをチェックしているわけではない点に注意してください。

yyyy-MM-dd のような文字列をチェックするコードも最後に紹介いたします。

JavaScript

const isDate = (v) => !isNaN(new Date(v).getTime());

TypeScript

const isDate = (v: string | number) => !isNaN(new Date(v).getTime());

実行結果

// 一般的なフォーマット
isDate('2021/02/03'); // true
isDate('2021-02-03'); // true
isDate('2021.02.03'); // true
isDate('2021_02_03'); // false

// 時刻を含んでいても、適切なフォーマットであればTrue
isDate('2021/02/03 12:00'); // true

// 秒換算の数値データでもTrue
isDate(1); // true
isDate('1'); // true
isDate(1612278000000); // true

getTime()のところは getDate でも getFullYear でもなんでもいけると思います。

Date オブジェクトは、たとえ引数に日付として適切でない値が渡されたとしてもエラーとならず、オブジェクト自体は作成されます。

ただ日付が設定されていないため、getDate などで値を取得することができず NaN を返します。

これを利用して、簡単に妥当性をチェックすることができます。

isNaN(new Date())のように、Date オブジェクトを直接 isNaN で判定することができますが、getTime を判定させた方が高速になるケースが多いらしい。

参考:JavaScript (node.js/chrome/firefox) で Invalid Date を判定する

秒換算のデータを許容してしまうあたり要件を満たせない場合もあるかもしれませんが、気にせず簡単に書きたい!という人向けです。 文字列を分解して妥当性をチェックする方法も後述します。

Date.parse()を使用する(IE 未対応)

ES5 に準拠しなくても良い場合は、ECMAScript-262で追加された、Date.parse()を使うことで、同様の結果を得ることができます。 こちらの方が簡易的に書けます。

const isDate = (v) => !isNaN(Date.parse(v));

文字列を分解してチェックする(IE 未対応)

最後にワンライナーではありませんが、前述の方法では要件を満たせないという場合、以下の方法で文字列を分解して妥当性をチェックすることもできます。

const isDate = (dateString) => {
  /** 妥当性チェックに使用する正規表現 */
  const regex = /^\d{4}[\/\-\.]\d{1,2}[\/\-\.]\d{1,2}$/;

  if (!dateString || !regex.test(dateString)) {
    return false;
  }

  const date = new Date(dateString);

  /** 文字列から抽出した各日付情報 */
  const [year, month, day] = dateString.split(/[\/\-\.]/);

  return (
    date.getFullYear() === Number(year) &&
    date.getMonth() + 1 === Number(month) &&
    date.getDate() === Number(day)
  );
};

日付をフォーマットする

日付を扱う上で必要になる関数として、妥当性チェックと同じくらい重要となるのが日付のフォーマット関数です。

yyyy-MM-dd hh:mm:ss にまで対応した、簡潔なコードを紹介していますので、よろしければご一読ください。

Date オブジェクトを任意の文字列でフォーマットする