我正在尝试使用javascript时代日期显示在本地时间保存记录的时间。问题是,这个划时代的日期似乎被CDT“卡住”了。
假设我将记录保存在9:18am CDT,这将以js划时代日期值1349896693626的形式进入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偏移量)才能使其正常工作,但这没有任何意义。有人能解释一下是怎么回事吗?
谢谢
发布于 2012-10-10 16:40:11
若要显示特定时区字符串,请忽略本地时区。
您只关心GMT时间,以及目标时区的正确偏移量。
中心时间是格林尼治标准时间后6或5小时,这取决于DST的适用范围。
// 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);
警报(中央时间:'+Date.toTZString(d,‘C’);
返回值:(字符串)中央时间:10月10日下午2时18分CDT
https://stackoverflow.com/questions/12822745
复制相似问题