--
--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:

20
2016

JavaScript標準のDateクラスで任意のタイムゾーンの日時を生成する

CATEGORYJavaScript
JavaScriptのDateクラスは何かと評判が悪い。タイムゾーンを持っているくせにデフォルト以外を使う方法がないというのもその一つで、場合によっては無理やり時刻を+05:00とかしてお茶を濁したりというバッドノウハウ的なことをしていたりする。
今回もそういうソースに当たったのだけど、設定ファイルに+5とか書いてたせいでサマータイム終了に追従してなくてずれたりしたので、せめてバッドな中でもタイムゾーンの時差ぐらい取れないかと試してみたら取れたので、それをメモっておく。
(というか、固定値でいいよって言われてボツったので、ここに上げとく。)
/**
* 時刻を指定されたタイムゾーン分を加味したものに変換する。
* @param {Date} date 変換する日時。
* @param {string} timezone タイムゾーン。
* @returns {Date} 変換した日時。
*/
function toLocalDate(date, timezone) {
// toLocaleString でタイムゾーンを加味した時刻を生成させて、それをUTCとして変換する
return new Date(date.toLocaleString('en-US', {
timeZone: timezone,
}) + ' UTC');
}

/**
* 時刻から指定されたタイムゾーン分の差分を取り除く。
* @param {Date} date 取り除く日時。
* @param {string} timezone タイムゾーン。
* @returns {Date} 取り除いた日時。
*/
function toUtcDate(date, timezone) {
// ローカル時間を出して時差を算出、その分を取り除く
var timestamp = date.getTime();
return new Date(timestamp - (toLocalDate(date, timezone).getTime() - timestamp));
}

var date = toLocalDate(new Date('2016-11-19T16:34:18.000Z'), 'America/New_York');
console.log(date.toISOString()); //2016-11-19T11:34:18.000Z
date = toUtcDate(date, 'America/New_York');
console.log(date.toISOString()); //2016-11-19T16:34:18.000Z
ChromeとEdgeとNode.jsで動作を確認。FIrefoxはタイムゾーンデータが無いので動作せず。

そう何気に toLocaleString() ではタイムゾーンを指定できるんですよね。
なので、一旦 toLocaleString() でタイムゾーンを計算した日時文字列にして、それを再度Dateにして、偽ローカルDateを作成。
(日時書式細かく指定できないので、localeが想定外の環境だとparseに失敗するかも?)

Dateにしてしまえば割と自由に使えるのでそれで処理。ちゃんとしたDateに戻す必要があれば、もっかい時差を引いて戻す、こんな感じ。


まあ、自由にライブラリ入れられるなら、Moment Timezoneとかいろいろあるみたいなので、そいつら使うのがたぶん吉。
バッドノウハウ感が漂ってるので、できれば標準クラスのみで何とかしたい、って場合用ってことで。
スポンサーサイト

Tag: JavaScript

0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。