🗓️

TypeScriptにおける日付フォーマットの個人的ベストプラクティス

2024/11/10に公開

はじめに

日付フォーマットって、こんな悩みありませんか?

  • MMmm のどちらが月でどちらが分だっけ...
  • フォーマットのためだけにライブラリを導入すべきか悩む

私はTypeScriptの場合、ライブラリを使わず、日付フォーマット用の独自メソッドを作っています。
JSDocを活用することで、↓のようにVSCodeのインテリセンスでフォーマットの一覧と使い方を表示できます

IDE dateUtil.ts

こうすることで、フォーマット指定のミスを防ぎつつ、チーム内での表示形式も統一できます。

実装

さきほどのgifを実現している実装は次のようになります。

dateUtil.ts
type SupportedDateFormat = 
  'YYYY/MM/DD' |
  'YYYY年M月D日(曜)'|
  'M/D(曜)' |
  'YYYY/MM/DD HH:mm:ss';

/**
 * 日付を YYYY/MM/DD 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY/MM/DD
 * @returns {string} 例: 2024/04/08
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD'): string;

/**
 * 日付を YYYY年M月D日(曜) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY年M月D日(曜)
 * @returns {string} 例: 2024年4月8日(月)
 */
export function formatDate(date: Date, format: 'YYYY年M月D日(曜)'): string;

/**
 * 日付を M/D 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format M/D(曜)
 * @returns {string} 例: 4/8(月)
 */
export function formatDate(date: Date, format: 'M/D(曜)'): string;

/**
 * 日時を YYYY/MM/DD HH:mm:ss 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY/MM/DD HH:mm:ss
 * @returns {string} 例: 2024/04/08 09:05:45
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD HH:mm:ss'): string;

// 実装
export function formatDate(date: Date, format: SupportedDateFormat): string {
  switch (format) {
    case 'YYYY/MM/DD':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      });

    case 'YYYY年M月D日(曜)':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: 'long',
        day: 'numeric',
        weekday: 'short'
      });

    case 'M/D(曜)':
      return date.toLocaleDateString('ja-JP', {
        month: 'numeric',
        day: 'numeric',
        weekday: 'short'
      });

    case 'YYYY/MM/DD HH:mm:ss':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      });

    default:
      throw new Error(`Unsupported format: ${format}`);
  }
}
main.ts
import { formatDate } from './dateUtil.ts'

const text = formatDate(new Date(), 'YYYY年M月D日(曜)');
console.log(text); // 2024年11月9日(土)
  • 日付フォーマットはJavaScript標準のtoLocaleDateStringを使っています。
  • 関数のオーバーロードを使うことで、フォーマットごとの説明をIDE上で表示させています。
  • フォーマット文字列はdayjsを参考にしています。

プレイグラウンド

↓で実際にVSCodeのインテリセンスが動くのでぜひ試してみて下さい。

長所短所

この方式の長所・短所を↓にまとめてみました。
個人的には1つのアプリで使うフォーマットが数パターンに収まる場合、長所の方が勝つんじゃないかと考えています。

長所

  • IDEの補完が便利
  • アプリケーションで扱うフォーマットを統一できる
  • フォーマット文字列の指定ミスが防げる
  • 日付ライブラリを入れないことでビルドサイズを抑えられる

短所

  • コードが長い
  • 新しいフォーマットを使う時にメソッドを定義するのが面倒
  • toLocaleDateStringの使い方が難しい
  • 日付ライブラリを既に導入している場合、逆にややこしい
    • ただ日付ライブラリのフォーマットを独自メソッド内で使って、他の場所でのフォーマットは独自メソッドを使うようにするのもあり

使いそうなフォーマットの実装(コピペ用)

↑の短所にもあるのように、toLocaleDateString を使った実装は癖があって、新しいフォーマットを定義するのは面倒です。
そのため、使いそうな日付フォーマットの実装を↓の dateUtil.ts (コピペ用) に書いておきました。
国内向けの日付フォーマットとしては、だいたい網羅しているんじゃないでしょうか?
52フォーマットあって、元号にも対応しています。
コピペして、要らないフォーマットは削除した上で使ってみてください。

dateUtil.ts (コピペ用)
dateUtil.ts
type SupportedDateFormat = 
  'YYYY-MM-DD' |
  'YYYY/MM/DD' |
  'YYYY/MM/DD(ddd)' |
  'YYYY/MM/DD(曜)' |
  'YYYY年M月D日'|
  'YYYY年M月D日(曜)'|
  '(元号)Y年M月D日' |
  '(元号)Y年M月D日(曜)' |
  '(GENGOU)Y.M.D' |
  '(GENGOU)Y.MM.DD' |
  'MM/DD' |
  'MM/DD(ddd)' |
  'MM/DD(曜)' |
  'M/D' |
  'M/D(ddd)' |
  'M/D(曜)' |
  'M月D日'|
  'M月D日(曜)'|
  'HH:mm:ss.SSS' |
  'HH:mm:ss' |
  'HH:mm' |
  'HH時mm分ss秒'|
  'HH時mm分'|
  'H時m分'|
  'HH時'|
  'H時'|
  'ISO8601' |
  'YYYY-MM-DDTHH:mm:ss.SSSZ' |
  'YYYY-MM-DD HH:mm:ss' |
  'YYYY/MM/DD HH:mm:ss' |
  'YYYY/MM/DD HH:mm' |
  'YYYY年MM月DD日HH時mm分ss秒'|
  'YYYY年M月D日H時m分'|
  'YYYY年M月D日H時'|
  '(元号)Y年M月D日H時m分'|
  '(元号)Y年M月D日H時'|
  'MM/DD HH:mm:ss' |
  'MM/DD HH:mm' |
  'MM月DD日HH時mm分ss秒'|
  'M月D日H時m分'|
  'M月D日H時'|
  'YYYY' |
  'MM' |
  'M' |
  'DD' |
  'D' |
  'HH' |
  'H' |
  'mm' |
  'm' |
  'ss' |
  's';

/**
 * 日付を YYYY-MM-DD 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY-MM-DD
 * @returns {string} 例: 2024-04-08
 */
export function formatDate(date: Date, format: 'YYYY-MM-DD'): string;

/**
 * 日付を YYYY/MM/DD 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY/MM/DD
 * @returns {string} 例: 2024/04/08
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD'): string;

/**
 * 日付を YYYY/MM/DD(ddd) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY/MM/DD(ddd)
 * @returns {string} 例: 2024/04/08(Mon)
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD(ddd)'): string;

/**
 * 日付を YYYY/MM/DD(曜) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY/MM/DD(曜)
 * @returns {string} 例: 2024/04/08(月)
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD(曜)'): string;

/**
 * 日付を YYYY年M月D日 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY年M月D日
 * @returns {string} 例: 2024年4月8日
 */
export function formatDate(date: Date, format: 'YYYY年M月D日'): string;

/**
 * 日付を YYYY年M月D日(曜) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format YYYY年M月D日(曜)
 * @returns {string} 例: 2024年4月8日(月)
 */
export function formatDate(date: Date, format: 'YYYY年M月D日(曜)'): string;

/**
 * 日付を (元号)Y年M月D日 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format (元号)Y年M月D日
 * @returns {string} 例: 令和6年4月8日
 */
export function formatDate(date: Date, format: '(元号)Y年M月D日'): string;

/**
 * 日付を (元号)Y年M月D日(曜) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format (元号)Y年M月D日(曜)
 * @returns {string} 例: 令和6年4月8日(月)
 */
export function formatDate(date: Date, format: '(元号)Y年M月D日(曜)'): string;

/**
 * 日付を (GENGOU)Y.M.D 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format (GENGOU)Y.M.D
 * @returns {string} 例: R6.4.8
 */
export function formatDate(date: Date, format: '(GENGOU)Y.M.D'): string;

/**
 * 日付を (GENGOU)Y.MM.DD 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format (GENGOU)Y.MM.DD
 * @returns {string} 例: R6.04.08
 */
export function formatDate(date: Date, format: '(GENGOU)Y.MM.DD'): string;

/**
 * 日付を MM/DD 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format MM/DD
 * @returns {string} 例: 04/08
 */
export function formatDate(date: Date, format: 'MM/DD'): string;


/**
 * 日付を MM/DD(ddd) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format MM/DD(ddd)
 * @returns {string} 例: 04/08(Mon)
 */
export function formatDate(date: Date, format: 'MM/DD(ddd)'): string;

/**
 * 日付を MM/DD 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format MM/DD(曜)
 * @returns {string} 例: 04/08(月)
 */
export function formatDate(date: Date, format: 'MM/DD(曜)'): string;

/**
 * 日付を M/D 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format M/D
 * @returns {string} 例: 4/8
 */
export function formatDate(date: Date, format: 'M/D'): string;

/**
 * 日付を M/D(ddd) 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format M/D(ddd)
 * @returns {string} 例: 04/08(Mon)
 */
export function formatDate(date: Date, format: 'M/D(ddd)'): string;

/**
 * 日付を M/D 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format M/D(曜)
 * @returns {string} 例: 4/8(月)
 */
export function formatDate(date: Date, format: 'M/D(曜)'): string;

/**
 * 日付を M月D日 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format M月D日
 * @returns {string} 例: 4月8日
 */
export function formatDate(date: Date, format: 'M月D日'): string;

/**
 * 日付を M月D日 形式の文字列に変換します
 * @param date 変換対象の日付
 * @param format M月D日(曜)
 * @returns {string} 例: 4月8日(月)
 */
export function formatDate(date: Date, format: 'M月D日(曜)'): string;

/**
 * 時刻を HH:mm:ss.SSS 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format HH:mm:ss.SSS
 * @returns {string} 例: 09:05:45.123
 */
export function formatDate(date: Date, format: 'HH:mm:ss.SSS'): string;

/**
 * 時刻を HH:mm:ss 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format HH:mm:ss
 * @returns {string} 例: 09:05:45
 */
export function formatDate(date: Date, format: 'HH:mm:ss'): string;

/**
 * 時刻を HH:mm 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format HH:mm
 * @returns {string} 例: 09:05
 */
export function formatDate(date: Date, format: 'HH:mm'): string;

/**
 * 時刻を HH時mm分ss秒 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format HH時mm分ss秒
 * @returns {string} 例: 09時05分05秒
 */
export function formatDate(date: Date, format: 'HH時mm分ss秒'): string;

/**
 * 時刻を HH時mm分 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format HH時mm分
 * @returns {string} 例: 09時05分
 */
export function formatDate(date: Date, format: 'HH時mm分'): string;

/**
 * 時刻を H時m分 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format H時m分
 * @returns {string} 例: 9時5分
 */
export function formatDate(date: Date, format: 'H時m分'): string;

/**
 * 時刻を HH時 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format HH時
 * @returns {string} 例: 09時
 */
export function formatDate(date: Date, format: 'HH時'): string;

/**
 * 時刻を H時 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format H時
 * @returns {string} 例: 9時
 */
export function formatDate(date: Date, format: 'H時'): string;

/**
 * 日時を YYYY-MM-DDTHH:mm:ss.SSSZ 形式の文字列に変換します(ISO 8601)
 * @param date 変換対象の日時
 * @param format ISO8601
 * @returns {string} 例: 2024-04-08T05:30:45.123Z
 */
export function formatDate(date: Date, format: 'ISO8601'): string;

/**
 * 日時を YYYY-MM-DDTHH:mm:ss.SSSZ 形式の文字列に変換します(ISO 8601)
 * @param date 変換対象の日時
 * @param format YYYY-MM-DDTHH:mm:ss.SSSZ
 * @returns {string} 例: 2024-04-08T05:30:45.123Z
 */
export function formatDate(date: Date, format: 'YYYY-MM-DDTHH:mm:ss.SSSZ'): string;

/**
 * 日時を YYYY-MM-DD HH:mm:ss 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY-MM-DD HH:mm:ss
 * @returns {string} 例: 2024-04-08 09:05:45.123
 */
export function formatDate(date: Date, format: 'YYYY-MM-DD HH:mm:ss'): string;

/**
 * 日時を YYYY/MM/DD HH:mm:ss 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY/MM/DD HH:mm:ss
 * @returns {string} 例: 2024/04/08 09:05:45
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD HH:mm:ss'): string;

/**
 * 日時を YYYY/MM/DD HH:mm 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY/MM/DD HH:mm
 * @returns {string} 例: 2024/04/08 09:05
 */
export function formatDate(date: Date, format: 'YYYY/MM/DD HH:mm'): string;


/**
 * 日時を YYYY年MM月DD日HH時mm分ss秒 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY年MM月DD日HH時mm分ss秒
 * @returns {string} 例: 2024年04月08日09時09分08秒
 */
export function formatDate(date: Date, format: 'YYYY年MM月DD日HH時mm分ss秒'): string;

/**
 * 日時を YYYY年M月D日H時m分 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY年M月D日H時m分
 * @returns {string} 例: 2024年4月8日14時30分
 */
export function formatDate(date: Date, format: 'YYYY年M月D日H時m分'): string;

/**
 * 日時を YYYY年M月D日H時 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY年M月D日H時
 * @returns {string} 例: 2024年4月8日14時
 */
export function formatDate(date: Date, format: 'YYYY年M月D日H時'): string;

/**
 * 日時を YYYY年M月D日HH時mm分ss秒 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY年M月D日HH時mm分ss秒
 * @returns {string} 例: 2024年4月8日09時05分05秒
 */
export function formatDate(date: Date, format: 'YYYY年MM月DD日HH時mm分ss秒'): string;

/**
 * 日時を YYYY年M月D日H時m分 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY年M月D日H時m分
 * @returns {string} 例: 2024年4月8日9時5分
 */
export function formatDate(date: Date, format: 'YYYY年M月D日H時m分'): string;

/**
 * 日時を YYYY年M月D日H時 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format YYYY年M月D日H時
 * @returns {string} 例: 2024年4月8日9時
 */
export function formatDate(date: Date, format: 'YYYY年M月D日H時'): string;

/**
 * 日時を (元号)Y年M月D日H時m分 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format (元号)Y年M月D日H時m分
 * @returns {string} 例: 令和6年4月8日9時30分
 */
export function formatDate(date: Date, format: '(元号)Y年M月D日H時m分'): string;

/**
 * 日時を (元号)Y年M月D日H時 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format (元号)Y年M月D日H時
 * @returns {string} 例: 令和6年4月8日9時
 */
export function formatDate(date: Date, format: '(元号)Y年M月D日H時'): string;

/**
 * 日時を MM/DD HH:mm:ss 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format MM/DD HH:mm:ss
 * @returns {string} 例: 04/08 09:05:45
 */
export function formatDate(date: Date, format: 'MM/DD HH:mm:ss'): string;

/**
 * 日時を MM/DD HH:mm 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format MM/DD HH:mm
 * @returns {string} 例: 04/08 09:05
 */
export function formatDate(date: Date, format: 'MM/DD HH:mm'): string;

/**
 * 日時を M月D日HH時mm分ss秒 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format M月D日HH時mm分ss秒
 * @returns {string} 例: 4月8日09時05分05秒
 */
export function formatDate(date: Date, format: 'MM月DD日HH時mm分ss秒'): string;

/**
 * 日時を M月D日H時m分 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format M月D日H時m分
 * @returns {string} 例: 4月8日9時5分
 */
export function formatDate(date: Date, format: 'M月D日H時m分'): string;

/**
 * 日時を M月D日H時 形式の文字列に変換します
 * @param date 変換対象の日時
 * @param format M月D日H時
 * @returns {string} 例: 4月8日9時
 */
export function formatDate(date: Date, format: 'M月D日H時'): string;

/**
 * 日時から特定の要素を抽出します
 * @param date 変換対象の日時
 * @param format 
 * - 'YYYY': 年(4桁)
 * - 'MM': 月(2桁)
 * - 'M': 月
 * - 'DD': 日(2桁)
 * - 'D': 日
 * - 'HH': 時(2桁)
 * - 'H': 時
 * - 'mm': 分(2桁)
 * - 'm': 分
 * - 'ss': 秒(2桁)
 * - 's': 秒
 * @returns {string} 指定された要素の文字列
 */
export function formatDate(date: Date, format: 'YYYY' | 'MM' | 'M' | 'DD' | 'D' | 'HH' | 'H' | 'mm' | 'm' | 'ss' | 's'): string;

// 実装
export function formatDate(date: Date, format: SupportedDateFormat): string {

  switch (format) {
    case 'YYYY-MM-DD':
      return date.toLocaleDateString('en-CA', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      });

    case 'YYYY/MM/DD':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      });

    case 'YYYY/MM/DD(ddd)':
      return `${date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      })}(${date.toLocaleDateString('en-US', { weekday: 'short' })})`;

    case 'YYYY/MM/DD(曜)':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        weekday: 'short'
      });

    case 'YYYY年M月D日':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: 'long',
        day: 'numeric'
      });

    case 'YYYY年M月D日(曜)':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: 'long',
        day: 'numeric',
        weekday: 'short'
      });

    case '(元号)Y年M月D日':
      return date.toLocaleDateString('ja-JP-u-ca-japanese', {
        year: 'numeric',
        month: 'long',
        day: 'numeric'
      });

    case '(元号)Y年M月D日(曜)':
      return date.toLocaleDateString('ja-JP-u-ca-japanese', {
        year: 'numeric',
        month: 'long',
        day: 'numeric',
        weekday: 'short'
      });

    case '(GENGOU)Y.M.D':
      return date.toLocaleDateString('ja-JP-u-ca-japanese', {
        year: 'numeric',
        month: 'numeric',
        day: 'numeric'
      }).replaceAll('/', '.');

    case '(GENGOU)Y.MM.DD':
      return date.toLocaleDateString('ja-JP-u-ca-japanese', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      }).replaceAll('/', '.');

    case 'MM/DD':
      return date.toLocaleDateString('ja-JP', {
        month: '2-digit',
        day: '2-digit',
      });

    case 'MM/DD(ddd)':
      return `${date.toLocaleDateString('ja-JP', {
        month: '2-digit',
        day: '2-digit'
      })}(${date.toLocaleDateString('en-US', { weekday: 'short' })})`;

    case 'MM/DD(曜)':
      return date.toLocaleDateString('ja-JP', {
        month: '2-digit',
        day: '2-digit',
        weekday: 'short'
      });

    case 'M/D':
      return date.toLocaleDateString('ja-JP', {
        month: 'numeric',
        day: 'numeric',
      });

    case 'M/D(ddd)':
      return `${date.toLocaleDateString('ja-JP', {
        month: 'numeric',
        day: 'numeric',
      })}(${date.toLocaleDateString('en-US', { weekday: 'short' })})`;

    case 'M/D(曜)':
      return date.toLocaleDateString('ja-JP', {
        month: 'numeric',
        day: 'numeric',
        weekday: 'short'
      });

    case 'M月D日':
      return date.toLocaleDateString('ja-JP', {
        month: 'long',
        day: 'numeric'
      });

    case 'M月D日(曜)':
      return date.toLocaleDateString('ja-JP', {
        month: 'long',
        day: 'numeric',
        weekday: 'short'
      });

    case 'HH:mm:ss.SSS':
      return `${
        date.toLocaleTimeString('ja-JP', {
          hour: '2-digit',
          minute: '2-digit',
          second: '2-digit',
          hour12: false
        })
      }.${String(date.getMilliseconds()).padStart(3, '0')}`;

    case 'HH:mm:ss':
      return date.toLocaleTimeString('ja-JP', {
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        hour12: false,
      });

    case 'HH:mm':
      return date.toLocaleTimeString('ja-JP', {
        hour: '2-digit',
        minute: '2-digit',
        hour12: false,
      });

    case 'HH時mm分ss秒':
      return `${
        String(date.getHours()).padStart(2, '0')
      }${
        String(date.getMinutes()).padStart(2, '0')
      }${
        String(date.getSeconds()).padStart(2, '0')
      }`;

    case 'HH時mm分':
      return `${
        String(date.getHours()).padStart(2, '0')
      }${
        String(date.getMinutes()).padStart(2, '0')
      }`;

    case 'H時m分':
      return `${date.getHours()}${date.getMinutes()}`;

    case 'HH時':
      return `${String(date.getHours()).padStart(2, '0')}`;

    case 'H時':
      return `${date.getHours()}`;

    case 'ISO8601':
    case 'YYYY-MM-DDTHH:mm:ss.SSSZ':
      return date.toISOString();

    case 'YYYY-MM-DD HH:mm:ss':
      return `${date.toLocaleDateString('en-CA', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      })} ${date.toLocaleTimeString('ja-JP', {
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      })}`;

    case 'YYYY/MM/DD HH:mm:ss':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      });

    case 'YYYY/MM/DD HH:mm':
      return date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit'
      });

    case 'YYYY年MM月DD日HH時mm分ss秒':
      return `${
        date.getFullYear()
      }${
        String(date.getMonth() + 1).padStart(2, '0')
      }${
        String(date.getDate()).padStart(2, '0')
      }${
        String(date.getHours()).padStart(2, '0')
      }${
        String(date.getMinutes()).padStart(2, '0')
      }${
        String(date.getSeconds()).padStart(2, '0')
      }`;

    case 'YYYY年M月D日H時m分':
      return `${
        date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: 'long',
        day: 'numeric'
        })
      }${date.getHours()}${date.getMinutes()}`;

    case 'YYYY年M月D日H時':
      return `${
        date.toLocaleDateString('ja-JP', {
        year: 'numeric',
        month: 'long',
        day: 'numeric'
       })
      }${date.getHours()}`;

    case '(元号)Y年M月D日H時m分':
      return `${
        date.toLocaleDateString('ja-JP-u-ca-japanese', {
          year: 'numeric',
          month: 'long',
          day: 'numeric'
        })
      }${date.getHours()}${date.getMinutes()}`;

    case '(元号)Y年M月D日H時':
      return `${
        date.toLocaleDateString('ja-JP-u-ca-japanese', {
          year: 'numeric',
          month: 'long',
          day: 'numeric'
        })
      }${date.getHours()}`;

    case 'MM/DD HH:mm:ss':
      return date.toLocaleDateString('ja-JP', {
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      });

    case 'MM/DD HH:mm':
      return date.toLocaleDateString('ja-JP', {
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit'
      });

    case 'MM月DD日HH時mm分ss秒':
      return `${
        String(date.getMonth() + 1).padStart(2, '0')
      }${
        String(date.getDate()).padStart(2, '0')
      }${
        String(date.getHours()).padStart(2, '0')
      }${
        String(date.getMinutes()).padStart(2, '0')
      }${
        String(date.getSeconds()).padStart(2, '0')
      }`;

    case 'M月D日H時m分':
      return `${
        date.toLocaleDateString('ja-JP', {
        month: 'long',
        day: 'numeric'
        })
      }${date.getHours()}${date.getMinutes()}`;

    case 'M月D日H時':
      return `${
        date.toLocaleDateString('ja-JP', {
        month: 'long',
        day: 'numeric'
        })
      }${date.getHours()}`;

    case 'YYYY':
      return String(date.getFullYear());

    case 'MM':
      return String(date.getMonth() + 1).padStart(2, '0');

    case 'M':
      return String(date.getMonth() + 1);

    case 'DD':
      return String(date.getDate()).padStart(2, '0');

    case 'D':
      return String(date.getDate());

    case 'HH':
      return String(date.getHours()).padStart(2, '0');

    case 'H':
      return String(date.getHours());

    case 'mm':
      return String(date.getMinutes()).padStart(2, '0');

    case 'm':
      return String(date.getMinutes());

    case 'ss':
      return String(date.getSeconds()).padStart(2, '0');

    case 's':
      return String(date.getSeconds());

    default:
      throw new Error(`Unsupported format: ${format}`);
  }
}

GitHubにも同様のコードを置いておきました。

https://github.com/Arahabica/date-format-ts

ボイスアップラボ

Discussion