2016/06/16

【JavaScript】Date(日時)をISO8601形式に変換する方法

サーバサイドでの日時の処理や保存は、ISO8601形式の日時を使って処理することが多い。
しかし、クライアントサイドでnew Date()としても、「Mon Jun 13 2016 16:11:26 GMT+0900 (JST)」となってしまい、そのままサーバサイドに渡すわけにはいかない。
ということで、DateオブジェクトをISO8601形式にフォーマットする方法をまとめる。



ISO8601 とは




ISO 8601は日付と時刻の表記に関する国際規格。

ISO 8601 - Wikipedia


ISO8601には基本表記と拡張表記がある。
基本表記
YYYYMMDDThhmmss+0000(例: 20160611T180000+0900)
拡張表記
YYYY-MM-DDThh:mm:ss+00:00(例: 2016-06-11T18:00:00+09:00)



DateオブジェクトをISO8601表記に変換する


// 拡張表記に変換して返す
var formatISO8601 = function (date) {
 var offset = (function (d) {
   var o = d.getTimezoneOffset() / -60;
    return ((0 < o) ? '+' : '-') + ('00' + Math.abs(o)).substr(-2) + ':00';
  })(date);

  return [
   [
     date.getFullYear(),
      ('00' + (date.getMonth() + 1)).substr(-2),
      ('00' + date.getDate()).substr(-2)
    ].join('-'),
    'T',
    [
     date.getHours(),
      date.getMinutes(),
      date.getSeconds()
    ].join(':'),
    offset
  ].join('');
};

var iso8601 = formatISO8601(new Date());
console.log(iso8601);

上記コードでは、拡張表記に変換している。
もし基本表記を使いたいなら、join('{記号}')となっている箇所や、+ ':00'となっている場所を修正すればよい。
ほとんどの場合、拡張表記のほうが見やすいし、DBでも扱えるので基本表記にすることはあまりないかもしれないが…。

getTimezoneOffset()は、UTCと現在のロケール時間との差(時差)を分単位で返す。
「0:00(UTC) - 09:00(JST) = -9時間」の時差となる。UTCより日本の時間の方が9時間進んでいるはずなのにマイナスで返ってくるので注意が必要だ。
そのため、時間単位に変換するときに「-60」で割っている。

('00' + xx).substr(-2) は左ゼロ埋めで2桁の文字列に変換しているだけ。



以上

written by @bc_rikko

0 件のコメント :

コメントを投稿