バックエンドデータが常にUTC時間で保存されるという課題があります。フロントエンドデータは常にCSTで表示されます。この「ブラックボックス」にアクセスできません。
これをデータウェアハウスに反映させたいと思います。これはヨーロッパ(CET)に拠点を置いています。したがって、「ローカル」変換は機能しません。
UTC時刻(エポックミリ秒または日付形式「2015-01-0100:00:00」で正確に変換できます)を中部標準時に正確に変換する最も簡単で簡単な方法を考えています。 (夏時間に基づいて5時間または6時間遅れています)。
「現地時間」への変換について多くのスレッドがあります...これも必要ありません。また、半年で間違っている6時間を減算したいだけでもありません。
誰かアイデアはありますか?これは非常に一般的な問題のようですが、私はしばらく探していましたが、何も見つかりませんでした。
moment.js を moment-timezone アドオンとともに使用すると、このタスクが簡単になります。
// construct a moment object with UTC-based input
var m = moment.utc('2015-01-01 00:00:00');
// convert using the TZDB identifier for US Central time
m.tz('America/Chicago');
// format output however you desire
var s = m.format("YYYY-MM-DD HH:mm:ss");
さらに、北米中部標準時全体を参照しているため、「中部標準時」または「CT」のいずれかを言う必要があります。北米に適用される略語「CST」は明示的にUTC-6を意味し、「CDT」略語は夏時間中のUTC-5に使用されます。
ただし、略語には注意してください。 「CST」は「中国標準時」を意味する場合があります。 (実際には 5つの異なる解釈 )。
タイムゾーンオフセットを使用して、5時間または6時間を差し引くかどうかを決定できます。
var dateJan;
var dateJul;
var timezoneOffset;
var divUTC;
var divCST;
// Set initial date value
dateValue = new Date('10/31/2015 7:29:54 PM');
divUTC = document.getElementById('UTC_Time');
divCST = document.getElementById('CST_Time');
divUTC.innerHTML = 'from UTC = ' + dateValue.toString();
// Get dates for January and July
dateJan = new Date(dateValue.getFullYear(), 0, 1);
dateJul = new Date(dateValue.getFullYear(), 6, 1);
// Get timezone offset
timezoneOffset = Math.max(dateJan.getTimezoneOffset(), dateJul.getTimezoneOffset());
// Check if daylight savings
if (dateValue.getTimezoneOffset() < timezoneOffset) {
// Adjust date by 5 hours
dateValue = new Date(dateValue.getTime() - ((1 * 60 * 60 * 1000) * 5));
}
else {
// Adjust date by 6 hours
dateValue = new Date(dateValue.getTime() - ((1 * 60 * 60 * 1000) * 6));
}
divCST.innerHTML = 'to CST = ' + dateValue.toString();
<div id="UTC_Time"></div>
<br/>
<div id="CST_Time"></div>
以下のコードスニペットを使用して変換できます。
function convertUTCtoCDT() {
var timelagging = 6; // 5 or 6
var utc = new Date();
var cdt = new Date(utc.getTime()-((1 * 60 * 60 * 1000) * timelagging));
console.log("CDT: "+cdt);
}