少し前からこれと戦っています。エポックを日付オブジェクトに変換しようとしています。エポックはUTCで送られてきます。new Date()にエポックを渡すと、ローカルエポックを想定してしまいます。UTCオブジェクトを作成し、setTime()
を使って適切なエポックに調整しようとしましたが、有用と思われる唯一のメソッドはtoUTCString()
で、文字列ではどうにもなりません。その文字列を新しい日付に渡すと、それがUTCであることに気づくはずですが、そうではありません。
new Date( new Date().toUTCString() ).toLocaleString()
次の試みは、ローカルの現在のエポックとUTCの現在のエポックの違いを取得しようとしましたが、これも取得できませんでした。
new Date( new Date().toUTCString() ).getTime() - new Date().getTime()
1000以下の非常に小さな差しか得られません(単位はミリ秒)。
何か提案はありますか?
単にUTC文字列を"local"文字列に変換したいだけなのでしょうか? そうですね。
var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
var t0 = new Date(dtstr);
var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
var t2 = (2 * t0) - t1;
return new Date(t2).toString();
})(utc_string);
EDIT。
var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());
EDIT 修正
@Amjadさん、良いアイデアですが、実装が不十分です。やってみる
Date.prototype.setUTCTime = function(UTCTimestamp) {
var UTCDate = new Date(UTCTimestamp);
this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
return this.getTime();
}