4

JavaScriptのエポック日付を使用して、ローカル時間でレコードが保存された日時を表示しようとしています。問題は、エポック日付が CDT に「スタック」しているように見えることです。

CDT の午前 9 時 18 分にレコードを保存するとします。これは、1349896693626 の js エポック日付値として DB に入ります。私のコードは次のとおりです。

var savedTime = 1349896693626;
var sDate = new Date();
sDate.setTime(Number(savedTime));
var offset = sDate.getTimezoneOffset();
//grabbing offset and changing it to milliseconds to adjust time
var milliOffset = offset * 60 * 1000;
var adjustedDate = Number(savedTime) - milliOffset;
var displayDate = new Date(adjustedDate);
alert("date is " + displayDate);

私は、displayDate が午前 9:18 を表示することを期待しています。CDT にいる場合は表示されますが、PDT に移動すると午前 5:18 と表示され、その理由がわかりません。それを機能させるには、オフセットを 5 時間 (CDT オフセット) にハードコードする必要があるようですが、それは意味がありません。誰が何が起こっているのか説明できますか?

ありがとう

4

1 に答える 1

0

特定のタイム ゾーン文字列を表示するには、ローカル タイムゾーンを無視します。

GMT 時間と、対象のタイム ゾーンの正しいオフセットだけを気にします。

中部時間は、DST が適用される範囲に応じて、GMT から 6 時間または 5 時間遅れています。

// standard time offsets
Date.tzones={
    N:['Newfoundland', -210],
    A:['Atlantic', -240],
    E:['Eastern', -300],
    C:['Central', -360],
    M:['Mountain', -420],
    P:['Pacific', -480],
    AK:['Alaska', -540],
    HA_:['Hawaii-Aleutian (Aleutian)', -600],
    HA:['Hawaii-Aleutian (Hawaii)', -600, -1]
};

//find the offset, accurate for US time zones since 2006
Date.dstOff= function(d, tz){
    var off= tz[1], countstart, countend, dstart, dend;
    var y= d.getUTCFullYear();
    if(off  && tz[2]!= -1){
        countstart= 8, countend= 1,
        dstart= new Date(Date.UTC(y, 2, 8, 2)),
        dend= new Date(Date.UTC(y, 10, 1, 2));
        while(dstart.getUTCDay()!== 0) dstart.setUTCDate(++countstart);
        while(dend.getUTCDay()!== 0) dend.setUTCDate(++countend);
        dstart.setUTCMinutes(off);
        dend.setUTCMinutes(off);
        if(dstart<= d && dend>= d) off+= 60;
    }
    return off;
}
//format the result:

Date.short_months= ['Jan', 'Feb', 'Mar', 'Apr',
'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

Date.toTZString= function(d, tzp){
    d= d? new Date(d):new Date();
    tzp= tzp || 'G';
    var h, m, apm= 'pm', off, dst,
    label= tzp+'ST', str,
    tz= Date.tzones[tzp.toUpperCase()];
    if(!tz) tz= ['Greenwich', 0];
    off= tz[1];
    if(off){
        dst= Date.dstOff(d, tz);
        if(dst!== off) label= tzp+'DT';
        d.setUTCMinutes(d.getUTCMinutes()+dst);
    }
    else label= 'GMT';
    h= d.getUTCHours();
    m= d.getUTCMinutes();
    if(h>12) h-= 12;
    else if(h!== 12) apm= 'am';
    if(h== 0) h= 12;
    if(m<10) m= '0'+m;
    var str= Date.short_months[d.getUTCMonth()]+' '+d.getUTCDate()+', ';
    return str+ h+':'+m+' '+apm+' '+label.toUpperCase();
};

var d= 新しい日付 (1349896693626);

alert('中部時間: '+Date.toTZString(d,'C'));

戻り値: (文字列)中部時間: 10 月 10 日午後 2 時 18 分 CDT

于 2012-10-10T16:40:11.343 に答える