2015-09-08 2 views
0

Я даты хранятся в timesheet.json в этом формате:высчитывает разницу даты от даты JSON строки

[{"id":1,"note":"some note about task 1","start":"2015-08-28 02:41:02 
    +0200","end":"2015-08-28 02:58:58 +0200","sheet":"job"},{"id":2,"note":"some 
    note about task 2","start":"2015-09-03 03:15:04 +0200","end":"2015-09-03 
    03:57:34 +0200","sheet":"job"},{"id":3,"note":"some note about task 
    3","start":"2015-09-03 23:09:50 +0200","end":"2015-09-03 23:58:00 
    +0200","sheet":"job"},{"id":5,"note":"this is a test task","start":"2015-09-08 
    19:46:19 +0200","end":"2015-09-08 20:11:22 +0200","sheet":"job"}] 

Как я изначально не имеют разницы экспортироваться в JSON Я пытаюсь вычислить его самостоятельно, и добавить он сначала разобрал json, прежде чем отправить его на handlebars.js для рендеринга шаблонов.

Однако я не могу преобразовать приведенные выше представления строк в Date() объектов, чтобы иметь возможность делать вычисления по разнице во времени.

Эта конструкция работает в node кли, и я могу сделать startTime.getTime() но он не работает в JavaScript:

var startTime = new Date('2015-08-28 02:58:58 +0200'); 

Вот код, который не работает:

$.getJSON('./timesheet.json', function(data){ 

     context.tasks = data; 

     for (var prop in context.tasks){ 

      var startTime = new Date(context.tasks[prop].start); 

      console.log(startTime); // Invalid Date 
      console.log(context.tasks[prop].start); // 2015-08-28 02:41:02 +0200 

      var endTime = new Date(context.tasks[prop].end); 

      var diff = endTime.getTime() - startTime.getTime(); // this doesn't work as endTime and startTime are not Date objects! 
      cosole.log(diff); // yields NaN 
     } 
     var html = template(context); 

     $('.tasklist').append(html); 
    }); 
+0

Вы, вероятно, не должны использовать 'для в' цикла. – SimpleJ

+1

Ваши данные не JSON, и его довольно неясно, какие значения вы передаете конструктору 'Date', но я бы начал отлаживать там – Amit

+0

, это JSON, я просто не размещал здесь весь контент JSON-файла, вместо этого я представил формат времени начала и окончания, поскольку вопрос заключается в том, как сделать с ними расчет – branquito

ответ

0

Я бы рекомендовал использовать для этого moment.js. Затем ваш код станет следующим. Я добавил несколько примеров использования time.js duration api, который обычно является лучшим способом взглянуть на разницу дат.

$.getJSON('./timesheet.json', function(data) { 
    for (var i = 0; i < data.length; i++) { 
     var startTime = moment(data[i].start); 
     var endTime = moment(data[i].end); 

     var diff = endTime.diff(startTime); // Difference in milliseconds 
     console.log(diff); 

     var duration = moment.duration(diff); // Duration object which may be more useful to you 
     console.log('as days: ' + duration.asDays()); 
     console.log('as minutes: ' + duration.asMinutes()); 
     // Etc... 
    } 
}); 
+0

все еще дает 'NaN' даже так. – branquito

+0

Как уже упоминалось, возникла проблема с тем, как вы выполняли итерацию через массив. Исправлен цикл цикла moment.js. – ivern

0

Я не уверен, как отформатирован ваш json. Но, я думаю, вы неправильно обращаетесь к своему json. Я попробовал следующий код, который дал правильные результаты.

Убедитесь, что вы используете for петлю вместо for..in

var timesheetJson = [{ 
    'start': '2015-08-28 02:41:02 +0200', 
    'end': '2015-08-28 02:58:58 +0200' 
}, { 
    'start': '2015-09-03 03:15:04 +0200', 
    'end': '2015-09-03 03:57:34 +0200' 
}]; 

for (var i=0; i<timesheetJson.length; i++) { 

    var startTime = new Date(timesheetJson[i].start); 
    var endTime = new Date(timesheetJson[i].end); 

    var diff = endTime.getTime() - startTime.getTime(); 
    console.log(diff); 
} 
+0

см. Мое редактирование, теперь вы можете увидеть фактическое содержимое файла JSON – branquito

+0

Он также должен работать с вашим json. Проверьте эту рабочую скрипту своими данными. Https://jsfiddle.net/ez1twxha/1/ – Sachin

0

Вы должны проверить данные, поступающие из файла JSON. Нет никакой проблемы с фактическим кодом манипулирования датой.

Когда вы получите это работает, это будет конвертировать результат в миллисекундах точечными дней плавающими:

diff/1000/60/60/24

Вы можете использовать каждый шаг формулы с модом % выражения, чтобы вернуться в более человек читаемый формат:

var seconds = diff/1000 % 60

var minutes = diff/1000/60 % 60

var hours = diff/1000/60/60 % 24

...

0

Вы получаете временную метку в формате UTC из базы данных и Javascript не «понять», что, как справиться с этим.
Мы должны перестроить его, разделив его на части и получить год, месяц, день, часы, минуты, секунды, параметры часового пояса и создать объект даты из него.

Так вот решение:

function UTCToDateObject(utcString) { 
 
    var t = utcString.split(/[- :]/); 
 
    var year = t[0]; 
 
    var month = t[1]-1; 
 
    var day = t[2]; 
 
    var hours = t[3] || 0; 
 
    var minutes = t[4] || 0; 
 
    var seconds = t[5] || 0; 
 

 
    if(t[6]) { // if timezone parameter exist, we cut hours and minutes to get to +0000 
 
     var hours =+ (-1)*parseInt(t[6].substr(0,3)); 
 
     var minutes =+ (-1)*parseInt(t[6].substr(3)); 
 
    } 
 

 
    var utcTime = Date.UTC(year, month, day, hours, minutes, seconds); // generating UTC time from parameters 
 
    return new Date(utcTime); // return date object 
 
} 
 

 
function UTCToTime(utc_string) { 
 
    return UTCToDateObject(utc_string).getTime()/1000; 
 
} 
 

 
function dateDiffUTC(startTime, endTime) { 
 
    return UTCToTime(endTime) - UTCToTime(startTime); 
 
} 
 

 

 
$.getJSON('./timesheet.json', function(data){ 
 
    context.tasks = data; 
 
    for (var prop in context.tasks){ 
 
     var startTime = context.tasks[prop].start; 
 
     var endTime = context.tasks[prop].end; 
 
     var diff = dateDiffUTC(startTime, endTime); 
 
     context.tasks[prop].timeDiff = diff; 
 
     console.log(diff); 
 
    } 
 
    var html = template(context); 
 

 
    $('.tasklist').append(html); 
 
});

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