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

时间:2016-03-04 22:32:31

标签: javascript datetime

我将以非UTC合规格式获得“2016-04-10 9:00:00.0”的输入时间格式。我需要在时间上附加“T”以使其符合UTC。我还会在输入中获得时区,例如“ - 5.00”。有了这些细节,我需要将输入时间转换为 4 PM (作为TimeZone传递的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中没有。那是我的问题。

2 个答案:

答案 0 :(得分:0)

如果这不是作业,请立即删除所有自定义日期处理代码,并使用库。安装moment.js和moment-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());

答案 1 :(得分:0)

您不应该使用Date构造函数解析字符串,它不可靠且主要依赖于实现。 IE 8不会像字符串一样解析ISO 8601。

可以通过获取数字并将它们传递给Date构造函数来轻松解析类似“2016-04-10 9:00:00.0”的字符串。然后应用偏移也是直截了当的(你正在做的是好的,但如果你愿意,它可以包含在解析函数中),参见下面的函数。在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;
  }

相关问题