日時でソートする[JavaScript]

日時(Date)での比較・ソートの方法について。

Date型の仕様について

JavaScriptにおけるDateは、 それどうしでの減算-や、 比較<, >が可能です。

これらの演算は内部でミリ秒での計算が行われます。


          console.log(new Date("2025-08-11 15:00:01")
                    - new Date("2025-08-11 15:00:00")); // 1000

          console.log(new Date("2025-08-11 15:00:01")
                    > new Date("2025-08-11 15:00:00")); // true
        

日付の配列をソートする

Dateオブジェクトの入った配列を新しい順にソートするには、このようにします。


          const dateArray = [
            new Date("2025/01/05"),
            new Date("2025/01/02"),
            new Date("2025/01/01"),
            new Date("2025/01/03"),
            new Date("2025/01/04"),
          ];

          // 新しい順
          const sortedDateArray = dateArray.toSorted((a, b) => {
            return b - a;
          });
          /*
           * 2025/01/05
           * 2025/01/04
           * 2025/01/03
           * 2025/01/02
           * 2025/01/01
           */
          
          // Array.prototype.toSorted()メソッドは少々新しい機能のため、
          // 使用できない場合は`[...dateArray].sort()`を使用します
        

古い順にソートするには、このようにします。


          // 古い順
          const sortedDateArray = dateArray.toSorted((a, b) => {
            return a - b;
          });
          /*
           * 2025/01/01
           * 2025/01/02
           * 2025/01/03
           * 2025/01/04
           * 2025/01/05
           */
        

NaNも扱う

無効な日付NaNが配列に含まれる場合は、ソートが適切に行われないため、 isNaN()を使用して適切に処理します。


            const dateArray = [
              new Date("0000/00/00"), // NaN
              new Date("2025/01/02"),
              new Date("2025/01/01"),
              new Date("0000/00/00"), // NaN
              new Date("2025/01/03"),
              new Date("2025/01/04"),
              new Date("0000/00/00"), // NaN
            ];

            // 新しい順、NaNを後方に送る
            const newestBackwardNaN = dateArray.toSorted((a, b) => {
              if (isNaN(b)) return -1;
              return b - a;
            });
            // [01/04, 01/03, 01/02, 01/01, NaN, NaN, NaN]

            // 新しい順、NaNを前方に送る
            const newestForwardNaN = dateArray.toSorted((a, b) => {
              if (isNaN(a)) return -1;
              return b - a;
            });
            // [NaN, NaN, NaN, 01/04, 01/03, 01/02, 01/01]

            // 古い順、NaNを後方に送る
            const oldestBackwardNaN = dateArray.toSorted((a, b) => {
              if (isNaN(b)) return -1;
              return a - b;
            });
            // [01/01, 01/02, 01/03, 01/04, NaN, NaN, NaN]

            // 古い順、NaNを前方に送る
            const oldestForwardNaN = dateArray.toSorted((a, b) => {
              if (isNaN(a)) return -1;
              return a - b;
            });
            // [NaN, NaN, NaN, 01/01, 01/02, 01/03, 01/04]
          
参考: MDN Web Docs