2016-03-07 86 views
0

我有日期的时间低于JavaScript转换逻辑,它将UTC时间转换为通过时区的本地时间。我想知道这个逻辑在Daylight转换过程中会正常工作吗?如果不是什么补救措施呢?我无法使用任何第三方库。我必须使用纯JavaScript或Angular JS。在夏令时转换期间,getTimezoneOffset()是否稳定?

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.toLocaleTimeString(); 
 
     console.log("Date 5",d5); 
 
     
 
     //d6 =d5.match(/(\d+)(?=:\d+:\d+)|([A-Z]+)(?=$)/g).join(" "); 
 
     
 
     //console.log("Date6",d6) 
 
     
 
     document.getElementById("hourValue").innerHTML = d5; 
 
     }
<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>

+1

你到底想干什么?如果您希望将“2016-04-10 09:00:00.0”视为本地(即基于主机系统设置),则可以在其他某个时区查找等效时间,您可以完全忽略主机时区。 – RobG

回答

2

使用getTimezoneOffset简单地获取从主机系统偏移,所以它是为 “稳定” 作为主机。

注:与Date构造函数的字符串的分析几乎完全依赖于实现和非常不可靠的,只是没有做到这一点。总是手动分析字符串。一个库可以提供帮助,但特定格式的解析函数是2行(3个验证)。

当你改变 “2016年4月10日09:00:00.0” 到 “2016-04-10T09:00:00.0” 你已经创建了一个ISO 8601的日期和时间字符串没有时区。如果正确地分析(使用浏览器的约10%将无法解析它在所有),它应该被视为本地日期和时间(铬错误地将它作为UTC,IE 11正确地方),因此主机系统设置将用于调整创建日期的UTC时间值,以便它代表相同的时刻。

例如

alert(new Date("2016-04-10T09:00:00.0")); 

应该(在把它当作UTC,这是错误的浏览器,但没有),打印日期2016年4月10日,上午09:00无论主机系统的时区偏移。

如果你想找出一些其他时区的等效时间,使用UTC的方法来调整日期(或直接设置为你做的时间价值)用以抵消。然后使用UTC方法读取日期和时间值。

例如找到UTC + 05的等效时间:30你可以这样做:

function toLocalISO(d){ 
 
    function z(n){return (n<10?'0':'') + n} 
 
    return d.getUTCFullYear() + '-' + z(d.getUTCMonth()+1) + '-' + z(d.getUTCDate()) + 'T' + 
 
     z(d.getUTCHours()) + ':' + z(d.getUTCMinutes()) + ':' + z(d.getUTCSeconds()) 
 
    
 
} 
 

 
var d = new Date('2016-04-10T09:00:00.0'); 
 
document.write('When it\'s : ' + d + ' here<br>'); 
 
d.setUTCMinutes(d.getUTCMinutes() + 330); 
 
document.write('It\'s : ' + toLocalISO(d) + ' at UTC+05:30');

+0

非常感谢。我可以说这个逻辑适用于DayLightSaving转场时间吗? – user5970552

+1

你可以说两件事。首先,为了与ISO 8601和ECMA-262一致,“2016-04-10T09:00:00.0”*应该被解析为本地。如果是,主机时区偏移量将影响创建的时间值。其次,* Date.parse *不可信(如当前两个浏览器的不一致性所证明的)。因此,如果您希望将字符串视为UTC,请手动将其解析为UTC,然后使用UTC方法应用时区偏移,然后使用UTC方法获取生成的日期和时间值。 – RobG