2015-10-20 2 views
0

Я пользовательский связывающий обработчик, который возвращает время заданной даты:Date.getTime возвращает значения дифферента на ИО и Windows,

var item = allBindings().data; 

var dateInit = new Date(item.Fecha()); 

var timezone = 0; //dateInit.getTimezoneOffset() * 60000; 

var ticksInit = dateInit.getTime() + timezone; 
var duration = item.Duracion() * 60 * 1000; 
var ticksEnd = ticksInit + duration; 

var hourInit = getShortTime(new Date(ticksInit)); 
var hourEnd = getShortTime(new Date(ticksEnd)); 

item.Fecha() является наблюдаемым, который содержит дату в формате JSON Формат: «2015-10-20T12: 00: 00» в этом случае

в браузере Windows, ticksInit имеет значение 1445335200000 но на Ipad имеет значение 1445342400000.

разница только два часа , похоже, что Ipad применяет корректор часового пояса.

+5

Вы не должны ** ** никогда разбора строк с помощью конструктора Date, вручную разобрать его с помощью [* собственный парсер * ] (http://stackoverflow.com/questions/15517024/how-to-assume-local-time-zone-when-parsing-iso-8601-date-string) или хорошо сохранившаяся библиотека. В ES5 ISO-подобные форматы без часового пояса рассматриваются как UTC, в ECMAScript 2015 они рассматриваются как локальные (а в предыдущих версиях были зависимыми от реализации). Это объясняет разницу, равную смещению часового пояса. Кроме того, IE8 вернет NaN (он не будет изначально обрабатывать форматы ISO). – RobG

+0

Это было бы намного проще с [moment.js] (http://momentjs.com). Кроме того, хорошо, что вы прокомментировали часовой пояс, потому что добавление тиков к дате - это неправильный способ компенсировать смещение часового пояса. –

ответ

0

Основываясь на комментарий @RobG «s здесь код, который решает проблему:

var item = allBindings().data; 

var aDate = item.Fecha().split("T")[0].split("-"); 
var aTime = item.Fecha().split("T")[1].split(":"); 

var dateInit = new Date(aDate[0],aDate[1]-1,aDate[2],aTime[0],aTime[1]); 

//var timezone = 0; //dateInit.getTimezoneOffset() * 60000; 

var ticksInit = dateInit.getTime(); 
var duration = item.Duracion() * 60 * 1000; 
var ticksEnd = ticksInit + duration; 

var hourInit = getShortTime(new Date(ticksInit)); 
var hourEnd = getShortTime(new Date(ticksEnd)); 

$(element).html(hourInit + "-" + hourEnd); 
+1

Упрощен, чтобы получить детали как 'item.Fecha(). Split (/ \ D + /)' или 'item.Fecha(). Match (/ \ d +/g)'. Кажется, вы игнорируете секундную часть времени. – RobG

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