ブラウザの日付加算・差分・書式変換を読み解く
_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時間単位の経過時間の計算であり、カレンダー上の日付の境界を数える処理ではありません。負の小数はゼロ方向へ切り捨てます。
(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なら時刻を省きます。秒があっても、この条件は変わりません。
(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 の表示設定を自動で読み込む処理はありません。
(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 で確認しています。ブラウザの日付解析は利用する環境でも確かめてください。実機の項目への設定・保存は未検証です。