2016-03-07 5 views
0

У меня есть дата ниже логики преобразования в Javascript, которая преобразует время UTC в локальное время часового пояса. Мне интересно, будет ли эта логика работать хорошо во время перехода на летнее время? Если нет, то для чего это средство? Я не могу использовать стороннюю библиотеку. Я должен использовать чистый 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 просто получает смещение от хост-системы, так как "стабильный", как хозяин.

Примечание: разбор строк с конструктором даты почти полностью зависит от реализации и очень ненадежный, просто не делайте этого. Всегда вручную разбирать строки. Библиотека может помочь, но функция синтаксического анализа для определенного формата - 2 строки (3 с проверкой).

Когда вы меняете «2016-04-10 09: 00: 00.0» на «2016-04-10T09: 00: 00.0», вы создали дату и время ISO 8601 без часовой пояс. Если правильно проанализировать (около 10% используемых браузеров вообще не будут анализировать его), то должен рассматриваться как локальная дата и время (Chrome неправильно относится к UTC, IE 11 правильно как локальный), поэтому хост системные настройки будут использоваться для корректировки значения времени UTC созданной даты, чтобы он представлял собой тот же момент времени.

например.

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

должен напечатать дату 10 апреля 2016 9:00 утра, независимо от часового пояса принимающей системы смещения (но не в браузерах, которые рассматривают его как UTC, что неправильно).

Если вы хотите найти эквивалентное время в каком-либо другом часовом поясе, используйте методы 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 Transition Time тоже? – user5970552

+1

Вы можете сказать две вещи. Во-первых, чтобы соответствовать ISO 8601 и ECMA-262, «2016-04-10-10T09: 00: 00.0» * должен * обрабатываться как локальный. Если это так, смещение часового пояса хоста повлияет на созданное значение времени. Во-вторых, * Date.parse * не заслуживает доверия (о чем свидетельствует несогласованность двух текущих браузеров). Итак, если вы хотите, чтобы строка обрабатывалась как UTC, проанализируйте ее вручную в формате UTC, примените смещение часового пояса с помощью методов UTC, затем используйте методы UTC, чтобы получить итоговые значения даты и времени. – RobG

Смежные вопросы