2011-08-31 49 views
1

我需要格式化javascript日期以通過json發送到服務器。服務器預計時間根據這個例子javascript時區格式

2011-08-31T06:49:28.931 -0700

它方便地告訴我,當我試圖提交類似

2011-08-31T06:49:28.931 -07:00

我遇到的麻煩是格式與時區部分,-0700。我一直在看Date API,並沒有看到指定時區格式的方法。我可以做d.getTimezoneOffset,但它會返回240(我認爲我在EDT中是Im)。

所以,我可以將240轉換爲0400來表示4小時。然而,我擔心其他時區的正確性。我的問題是

1)如何將getTimezoneOffset()的結果轉換爲所需的格式,以及如何確定標誌應該是什麼(這就是我擔心的部分)?

2)有沒有辦法讓日期對象本身的格式,所以我不必做任何自定義?如果我做d.toString()我得到"Wed Aug 31 2011 09:48:27 GMT-0400 (EDT)",所以這裏的時區部分是我想要的格式。所以這可能是可能的。也許最好的解決方案是使用正則表達式來關閉時區d.toString() ...

3)額外信用:服務器需要某種標準的格式?使用match(/^.*GMT(-?\d*)/)在數組的索引1處返回「-0400」。也許我應該使用它?我想知道這個正則表達式是否適用於符號背景下的所有時區。

+1

您已經測試方法的toJSON()? –

+0

@andrew你是什麼意思? 'toJson'返回類似於「2011-08-31T14:29:38.924Z」的東西,它似乎沒有包含任何時區信息 – hvgotcodes

+0

(new Date(Date.now()))。toJSON()將日期輸出爲字符串「2011 -08-31T14:31:48.875Z「在格林尼治時區。 –

回答

0

您可能想要使用支持此時區格式的日期/時間格式化庫(例如http://jacwright.com/projects/javascript/date_format/)。無論如何,你是對的:控制格式輸出真的沒有好方法。

就正則表達式而言,我不知道所有的瀏覽器都一直使用GMT字符串格式,所以這可能不是最好的路徑。

1

試試這個代碼:

var d=new Date(Date.now()); // sets your date to variable d 

function repeat(str,count) { // EXTENSION 
    return new Array(count+1).join(str); 
}; 

function padLeft(str,length,char) { // EXTENSION 
    return length<=str.length ? str.substr(0,length) : repeat(String(char||" ").substr(0,1),length-str.length)+str; 
}; 

var str=padLeft(String(d.getFullYear()),4,"0")+"-"+ 
     padLeft(String(d.getMonth()),2,"0")+"-"+ 
     padLeft(String(d.getDate()),2,"0")+"T"+ 
     padLeft(String(d.getHours()),2,"0")+":"+ 
     padLeft(String(d.getMinutes()),2,"0")+":"+ 
     padLeft(String(d.getSeconds()),2,"0")+"."+ 
     d.getMilliseconds(); 
//str+=" GMT"; 
var o=d.getTimezoneOffset(),s=o<0?"+":"-",h,m; 
h=Math.floor(Math.abs(o)/60); 
m=Math.abs(o)-h*60; 

str+=" "+s+padLeft(String(h),2,"0")+padLeft(String(m),2,"0"); 

alert(str);