2016-01-30 2 views
-2

Строка ввода даты: 2016-01-11 23:00:00.Создание объекта даты возвращает NaN в Safari

$scope.formDate = function(date) { 
    return new Date(date).getTime(); 
} 

Выход в Chrome является 1452549600000, Сафари NaN.

Как я могу сделать этот кроссбраузер совместимым?

+0

@ MEF-это дубликат вопрос, но ответ есть не хороший. – RobG

ответ

1

Как я могу сделать этот кроссбраузер совместимым?

Разбив строку на составные части, а затем кормить их к правильному Date конструктору:

$scope.formDate = function(date) { 
    var matches = date.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/); 

    if (matches == null) { 
     // An invalid date was entered 
     return null; 
    } 

    var resultDate = new Date(
     parseInt(matches[1]), 
     parseInt(matches[2]) - 1, // months are 0 based in javascript 
     parseInt(matches[3]), 
     parseInt(matches[4]), 
     parseInt(matches[5]), 
     parseInt(matches[6]) 
    ); 

    return resultDate.getTime(); 
} 
0

Вы всегда должны вручную разобрать дату строки, библиотека может помочь, но, как правило, не является необходимым.

Формат в OP не является допустимой строкой ISO, что означает, что браузеры могут обрабатывать ее, как бы они ни желали (и Safari соответствует спецификации языка при обработке NaN, то есть недопустимой строки даты). Самый близкий ISO 8601 формат - «2016-01-11T23: 00: 00». Строки, совместимые с ISO без временной зоны, следует рассматривать как локальные.

Однако браузеры могут обрабатываться как UTC, local или NaN в зависимости от браузера. Простая функция для разбора его в качестве местного времени:

/** 
 
* Parse an ISO string without validation 
 
* @param {string} s - date string in format yyyy-mm-dd hh:mm:ss 
 
* @returns {Date} parsed as a local date 
 
*/ 
 
function parseISOSimple(s) { 
 
    var b = s.split(/\D/); 
 
    return new Date(b[0],b[1]-1,b[2],b[3],b[4],b[5]); 
 
} 
 

 
document.write('Simple: ' + parseISOSimple('2016-01-11 23:00:00'))

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