2012-10-10 21 views
4

我試圖顯示當一個記錄被保存在當地時間使用javascript時代的日期。問題在於時代日期似乎「卡住」了CDT。顯示當地時間從紀元日期

可以說我保存記錄在上午9時18 CDT,這個進入DB爲1349896693626. JS的時代日期值我的代碼如下:

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偏移)才能使其工作,但這沒有任何意義。任何人都可以解釋發生了什麼?

謝謝

+1

1349896693626實際上是下午2時18 CDT:http://www.wolframalpha.com/input/?i=timestamp + 1349896693 +到+ CDT – Roman

回答

0

要顯示特定的時區字符串,請忽略本地時區。

您只關心GMT時間以及目標時區的正確偏移量。

中央時間爲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 = new Date(1349896693626);

alert('Central time:'+ Date.toTZString(d,'C'));

返回值:(字符串)中部時間:10月10日,下午2時18 CDT