JavaScript ISO8601形式の日時表記を生成


単純にDate()オブジェクトのtoISOString()メソッドを使えばISO8601形式の日時を返してくれますが、これはどの地域で実行してもZ(UTC)で返ってきますので、地域に合わせたオフセット付きの表記で返すメソッドを書いてみました。

Date.prototype.iso8601 = function() {
    if(isNaN(this)) return this;
    const d = new Date(this - this.getTimezoneOffset() * 6e4);
    return d.toISOString().slice(0, -5) +
           d.toString().match(/[-+]..../)[0].replace(/(..)$/, ':$1');
}

example
// 現在日時
console.log( new Date().iso8601() ); // 2020-07-17T14:31:50+09:00
// 任意日時
console.log( new Date('2020/01/01 00:00:00').iso8601() ); // 2020-01-01T00:00:00+09:00
console.log( new Date(1234567890123).iso8601() ); // 2009-02-14T08:31:30+09:00
console.log( new Date(0).iso8601() ); // 1970-01-01T09:00:00+09:00

他のメソッドとの表記の比較および日時としては同一かの検証

const date = new Date('2020/01/01 00:00:00');
const time = date.getTime();
console.log(time);
const a = [];
console.log( a[0] = date.toString() );
console.log( a[1] = date.toISOString() );
console.log( a[2] = date.iso8601() );
console.log( new Date(a[0]).getTime() );
console.log( new Date(a[1]).getTime() );
console.log( new Date(a[2]).getTime() );

結果

順に、
(1) '2020/01/01 00:00:00' のUNIX時間基準のミリ秒(時差が考慮されますので地域によって変わります)

(2) .toString()を追加したもの
(3) .toISOString()を追加したもの
(4) .iso8601()を追加したもの

(5) (2)を初期値として.getTime()を通したもの
(6) (3)を初期値として.getTime()を通したもの
(7) (4)を初期値として.getTime()を通したもの

(2)~(4)のそれぞれの表記は違っても、(1)と(5)~(7)が同一であればそれぞれ同じ日時ということです。


日本以外の地域でもその地域に合わせたタイムゾーンで表示されるか、またそれが日時として正しい結果かを確認してみます。

JavaScriptではPHPのdate_default_timezone_set()のようなスクリプト内で使用されるデフォルトタイムゾーンを変更する手段は無いようなので、直接OSのタイムゾーン設定を変えて確認。
OSのタイムゾーン設定を変更すると他の多くのプロセスの動作にも影響が出る可能性がありますので、あまりやらないほうがよいです。







アデレートはUTC+09:30であるのに結果が+10:30となっているのは、サマータイムが反映されているためです。
(1月の日付で検証しているのにサマータイムが反映されているのは南半球にある地域のため)