2016-05-03 2 views
1

Я использую highcharts для рисования диаграмм и анализа даты с помощью функции new Date(). В Chrome и FF дата отлично разбирается.JavaScript new Date() Возвращение NaN в IE, Safari

Но в IE и Safari я получаю NaN и недопустимый формат даты resp.

Ниже данные я получаю от базы, в (element.x) массив

2016, 04,05 
2016, 04,06 
2016, 04,07 
2016, 04,08 
2016, 04,09 
2016, 04,10 

Теперь, я уверен, преобразование его в Date объект в JavaScript, как показано ниже:

//Loop starts 
var xAxis = new Date(element.x); 
datas.push([Date.UTC(xAxis.getUTCFullYear(),xAxis.getUTCMonth(), xAxis.getUTCDate())]); 
//Loop ends 

Теперь, эта операция возвращает NaN в IE, но работает очень хорошо в хроме, как показано ниже:

Chrome

Array([0]=>140004454) - Unix Time stamp i get 

IE

Array([0]=>NaN) 
+1

После правильного разбора строки, если вы хотите получить массив значений времени, просто выполните 'datas.push (+ xAxis)', который будет принуждать Date к числу, возвращая его значение времени. Или используйте 'xAxis.getTime()', если вам нужно что-то более четкое. – RobG

+0

Но проблема была в новой функции Date(). Он не правильно обрабатывал дату. – Gags

+0

Следовательно, почему это комментарий, а не ответ? Я уже дал Джону +1. :-) Просто подумал, что я бы сэкономил вам кучу ввода и ненужного вызова Date.UTC. – RobG

ответ

5

Путь new Date(dateString) разбирает dateString варьируется для различных браузеров, с некоторыми браузерами являются более гибкими, чем другие.

Самый безопасный способ для создания даты, чтобы ...

  1. разделить ваш element.x на компоненты
  2. преобразовать эти компоненты целочисленных значений
  3. создать новую дату, используя синтаксис new Date(year, month, day)

Таким образом, вместо того, чтобы ...

var xAxis = new Date(element.x); 

... создать свой срок, как это:

var xvals = element.x.split(','); 
var xAxis = new Date(
    parseInt(xvals[0]), 
    parseInt(xvals[1]) - 1, 
    parseInt(xvals[2]) 
); 

Это должно работать во всех браузерах!

+0

Вы сохранили мой день :) – Gags

+0

Плюс один для разбора значений. BTW, не нужно * parseInt *. – RobG

+1

@ JohnSlegers - в спецификации не указаны целые числа. [* ECMA-262 §20.3.2.1 *] (http://www.ecma-international.org/ecma-262/6.0/# sec-date-year-month-date-hours-minutes-seconds-ms) требует, чтобы * ToNumber * вызывался по каждому значению независимо от его типа, так что строки в порядке. Аплодируйте свои мотивы. – RobG

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