JavaScript:如何将UTC日期时间转换为使用纯Javascript的EST时间?

问题描述:

我将以非UTC合规格式获得输入时间格式为“2016-04-10 9:00:00.0”。我需要在时间后附加“T”以使其符合UTC。我还会在输入中获得时区,例如“-5.00”。有了这个细节,我需要将我的输入时间转换为下午4点(作为TimeZone传递的EST时间)。JavaScript:如何将UTC日期时间转换为使用纯Javascript的EST时间?

我不能使用任何第三方库。

HTML

<h1> 
TimeZone 
</h1> 
<h2 id="hourValue"> 

</h2> 
<table> 
<tr> 
    <td>Date Time</td> 
    <td><input type="text" id="txtDate" value="2016-04-10 09:00:00.0" /></td> 
</tr> 
<tr><td>TimeZone</td></tr> 
<tr><td><input type="text" id="txtOffset" value="-5.00" /></td></tr> 
<tr><td><input type="submit" id="btnSubmit" value="Convert" onClick="myTime()" /></td></tr> 
</table> 

JavaScript 
function myTime() 
{ 

var d1= document.getElementById("txtDate").value; 
var zOffset = document.getElementById("txtOffset").value; 
console.log("Date1",d1); 

var d2 = new Date(d1.replace(/ /g,'T')); 

var d3= d2.getTime()+(d2.getTimezoneOffset()*60000); 

console.log("Date2",d2); 
console.log("Date3",d3); 
var d4 = new Date(d3 + (3600000 * zOffset)); 

console.log("Date3",d3); 
console.log("Date 4",d4); 

var d5 = d4.toLocaleString(); 
console.log("Date 5",d5); 

d6 =d5.match(/(\d+)(?=:\d+:\d+)|([A-Z]+)(?=$)/g).join(" "); 

console.log("Date6",d6) 

document.getElementById("hourValue").innerHTML = d6.value; 
} 

我在评论区下面给出的jsfiddle链接,小提琴工作正常在FF而不是在IE中。这是我的问题。

+0

http://momentjs.com/ – Mike

+0

的jsfiddle链接,上述代码:https://jsfiddle.net/etpo99ua/31/。这jsFiddle不工作在Internet Explorer中,并在Firefox中工作正常 – user5970552

如果这不是作业,请立即删除所有自定义日期处理代码,并使用库。安装moment.js和矩timezone.js,和你的代码将成为类似:

moment.tz.add("America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6"); 

console.log(moment.tz(utcTimeString, "America/New_York").format()); 
+0

这些古怪的字符是什么? –

+0

只是'时间 - 时区'的有趣的数据包装格式:http://momentjs.com/timezone/docs/#/data-formats/ – user2926055

+0

我明白了。认为这是二进制的片刻。 –

你不应该与Date构造解析字符串,这是不可靠的,在很大程度上取决于执行。 IE 8不会像字符串那样解析ISO 8601。

像“2016-04-10 9:00:00.0”这样的字符串可以通过获取数字并将它们传递给Date构造函数来轻松解析。然后应用一个偏移量也是直接的(你正在做的是好的,但如果你喜欢它可以包含在分析函数中),请参见下面的函数。在IE 8中有效的工具也可以在其他地方使用。

我假设你的偏移量是±h.mm,但它可能是十进制小时,在这种情况下只需修改偏移量部分(或单独应用)。我将分钟直接应用到分钟值而不是时间值。

但是,任何此类函数都应该验证这些值,并在出现错误时返回相应的错误消息。

// Date string like: 2016-04-10 09:00:00.0 
 
// Offset like: -5.00 assuming h.mm 
 
function parseString(dateString, offset) { 
 
    var b = dateString.split(/\D+/); 
 
    var o = (offset < 0? -1 : 1) * 
 
      (Math.abs(parseInt(offset)*60) + +(offset.replace(/^.*\.(\d+)$/,'$1'))); 
 
    return new Date(Date.UTC(b[0], b[1]-1, b[2], b[3], +b[4]-o, 
 
          b[5], (b[6]+'00').slice(0,3))); 
 
} 
 

 
// Sample values 
 
var dateString = '2016-04-10 09:00:00.0' 
 
var offset = '-5.00'; 
 
var d = parseString(dateString, offset); 
 
document.write(
 
'<br>Time : ' + dateString + 
 
'<br>Offset: ' + offset + 
 
'<br>Local : ' + d);
body { 
 
    font-family: courier, monospace; 
 
    white-space: pre; 
 
    }