2011-08-31 51 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);