Skip to content

ブラウザの日付加算・差分・書式変換を読み解く ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

_time.js はブラウザの JavaScript Date を使う関数群です。サーバースクリプトの日時 API とは別で、表示書式・タイムゾーン・文字列の解析を自動で統一するものではありません。

日付を足す前に、値が Date か文字列か、日付差が暦の日数か時間差かを分けます。以下はブラウザ側の処理です。

日付加算と差分の型・方向 ​

関数実装の意味境界
dateAdd('d', num, date)コピーした Date に元の日付 + num を setDate元の Date は変更しない。元の date.getDate() を読むので Date を渡す
dateDiff('d', date1, date2)date1 - date2 を 86400000 で割って parseInt第1引数の日付から第2引数の日付を引く。小数部分を切り捨てる
上記の type が d 以外switch に対応分岐がないundefined を返す

根拠は 加算と差分です。dateDiff は24時間単位の経過時間の計算であり、カレンダー上の日付の境界を数える処理ではありません。負の小数はゼロ方向へ切り捨てます。

js
(function () {
    const original = new Date(2026, 9, 12, 9, 30);
    const tomorrow = $p.dateAdd('d', 1, original);
    console.log(original.getDate()); // 12(元の値は変わらない)
    console.log(tomorrow.getDate()); // 13

    const start = new Date(2026, 9, 12, 0, 0);
    const end = new Date(2026, 9, 13, 12, 0);
    console.log($p.dateDiff('d', end, start)); // 1
    console.log($p.dateDiff('d', start, end)); // -1
    console.log($p.dateAdd('m', 1, original)); // undefined
})();

加算の num は数値を渡します。文字列の '1' では、getDate() + num が文字列の連結になるため、1日加算の指定にはなりません。

Date の月は0始まりなので、このコードの9は10月です。例はブラウザコンソールで実行できます。文字列を dateAdd に直接渡すと、getDate を呼ぶ段階で例外になります。

日付だけにする関数と文字列化 ​

関数結果
shortDateString(date)年/月/日。月・日のゼロ埋めはしない
shortDate(date)shortDateString の文字列を new Date で解析した Date
beginningMonth(date)年/月/1 の文字列を new Date で解析した Date
dateTimeString(date)日付 + 必要なら時:分。秒は出力しない

引数が undefined の場合は現在の Date を使います。これらは getFullYear・getMonth・getDate などでローカルの年月日を読み、Date を作る関数はスラッシュ形式の文字列解析も使います(日付の整形)。

dateTimeString は 時 + 分が0なら時刻を省きます。秒があっても、この条件は変わりません。

js
(function () {
    const midnightWithSeconds = new Date(2026, 9, 12, 0, 0, 45);
    console.log($p.dateTimeString(midnightWithSeconds)); // 2026/10/12
    console.log($p.dateTimeString(new Date(2026, 9, 12, 9, 5))); // 2026/10/12 09:05
    console.log($p.shortDateString(new Date(2026, 0, 2))); // 2026/1/2
})();

ISO 8601 の UTC 文字列を生成する処理ではありません。保存用の形式と画面上の表示文字列を同じものとして扱わず、サーバー側の日時処理とも区別します。

dateTimeFormatString の対応書式 ​

dateTimeFormatString(date, dateFormat) は、書式を汎用のトークン解析器へ渡さず、switch の文字列と一致するかを調べます(対応書式)。

日付部分日付のみ時刻付きの形式
MM/dd/yyyy対応HH:mm、HH:mm:ss を付けたもの
yyyy/MM/dd対応HH:mm、HH:mm:ss を付けたもの
yyyy.MM.dd.対応HH:mm、HH:mm:ss を付けたもの
yyyy.MM.dd対応HH:mm、HH:mm:ss を付けたもの

時刻はゼロ埋めしますが、月・日はゼロ埋めしません。yyyy.MM.dd. の日付のみには末尾の空白もあります。対応しない書式、または未指定では、月/日/年 時:分:秒の既定分岐へ進みます。Hidden の表示設定を自動で読み込む処理はありません。

js
(function () {
    const date = new Date(2026, 0, 2, 9, 5, 7);
    console.log($p.dateTimeFormatString(date, 'yyyy/MM/dd HH:mm:ss'));
    // 2026/1/2 09:05:07
    console.log($p.dateTimeFormatString(date, 'yyyy-MM-dd'));
    // 1/2/2026 09:05:07(この書式は対応分岐にない)
})();

transferedDate は日付へ変換し、時刻を残さない ​

関数名は transferedDate です。実装は Moment で format.toUpperCase() を使って読み、YYYY/MM/DD に変換してから new Date を作ります(変換)。

書式が指定できるという点は dateTimeFormatString と違います。一方、最終的に日付文字列へ変換するため、入力の時刻まで保持する関数ではありません。大文字化した書式が Moment に渡ること、Moment のグローバルが必要なことも確認します。ここでは Moment を使うこの経路の実行結果は検証していません。

検証範囲と関連ページ ​

掲載した3つのコードと加算・差分・出力書式は、本体 JavaScript で確認しています。ブラウザの日付解析は利用する環境でも確かめてください。実機の項目への設定・保存は未検証です。

変更履歴

第1版フロント基盤JSのイベント・通信・日時処理を詳しく解説