Javascript 显示从纪元日期开始的本地时间

Javascript 显示从纪元日期开始的本地时间,javascript,date,timezone,epoch,timezone-offset,Javascript,Date,Timezone,Epoch,Timezone Offset,我试图显示记录是何时使用javascript纪元日期保存在本地时间的。问题是纪元日期似乎“卡在”CDT上 假设我在CDT上午9:18保存记录,它作为js epoch date值1349896693626进入数据库。我的代码如下: var savedTime = 1349896693626; var sDate = new Date(); sDate.setTime(Number(savedTime)); var offset = sDate.getTimezoneOffset(); //grab

我试图显示记录是何时使用javascript纪元日期保存在本地时间的。问题是纪元日期似乎“卡在”CDT上

假设我在CDT上午9:18保存记录,它作为js epoch date值1349896693626进入数据库。我的代码如下:

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偏移量)才能让它工作,但这没有任何意义。有人能解释发生了什么事吗


谢谢

要显示特定的时区字符串,请忽略本地时区

您只关心GMT时间和目标时区的正确偏移量

根据DST适用的范围,中心时间比格林尼治标准时间晚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();
};
//标准时间偏移
Date.tzones={
N:[‘纽芬兰’,-210],
答:['大西洋',-240],
E:[‘东部’,-300],
C:[‘中央’,-360],
M:[‘山’,-420],
P:[‘太平洋’,-480],
AK:[‘阿拉斯加’,-540],
[夏威夷-阿留申群岛(阿留申群岛)]-600],
HA:[‘夏威夷-阿留申(夏威夷)’,-600,-1]
};
//查找偏移量,自2006年以来适用于美国时区
Date.dstOff=函数(d,tz){
var off=tz[1],计数开始,计数结束,dstart,dend;
变量y=d.getUTCFullYear();
如果(关闭和启动[2]!=-1){
countstart=8,countend=1,
dstart=新日期(UTC日期(y,2,8,2)),
dend=新日期(UTC日期(y,10,1,2));
而(dstart.getUTCDay()!==0)dstart.setUTCDate(++countstart);
而(dend.getUTCDay()!==0)dend.setUTCDate(++countend);
数据开始设置分钟(关闭);
dend.setUTCMinutes(关闭);
如果(dstart=d)关闭+=60;
}
返回;
}
//格式化结果:
日期.短月份=['1月','2月','3月','4月',
“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”];
Date.toTZString=函数(d,tzp){
d=d?新日期(d):新日期();
tzp=tzp | |“G”;
变量h、m、apm=‘pm’、off、dst、,
标签=tzp+'ST',str,
tz=Date.tzones[tzp.toUpperCase()];
如果(!tz)tz=['Greenwich',0];
off=tz[1];
如果(关闭){
dst=日期。dstOff(d,tz);
如果(dst!==off)标签=tzp+'DT';
d、 setUTCMinutes(d.getUTCMinutes()+dst);
}
else标签='GMT';
h=d.getUTCHours();
m=d.getUTCMinutes();
如果(h>12)h-=12;
如果(h!==12)apm='am';
如果(h==0)h=12;

如果(m1349896693626)实际上是下午2:18 CDT: