2015-11-18 5 views
2

Я пытаюсь использовать JavaScript для прокрутки json-файла, который имеет периоды времени (начальная дата/время и дата окончания/время) и проверяет, находится ли сейчас (текущее время даты) между любым временем период в таком списке.JavaScript-цикл через Json-даты

Следующий мой код, но я не могу понять, где я ошибаюсь. Любая помощь?

<html> 
<script type="text/javascript"> 
    var data = { 
     "period": { 
      "startend": [{ 
       "startDate": "2015-11-17 15:43:37", 
       "endDate": "2015-11-18 19:43:37" 
      }, { 
       "startDate": "2015-12-17 19:43:37", 
       "endDate": "2016-01-17 19:43:37" 
      }, { 
       "startDate": "2015-04-17 19:43:37", 
       "endDate": "2015-04-18 19:43:37" 
      }] 
     } 
    } 

    var periodArray = data.period.startend; 
    var curDate = new Date(); 
    var datetime = curDate.getFullYear() + '-' + curDate.getMonth() + '-' + curDate.getDate() + ' ' + curDate.getHours() + ':' + curDate.getMinutes() + ':' + curDate.getSeconds(); 

    for (i = 0; i < periodArray.length ; i++) { 
     var obj = periodArray[i] 
      if (datetime > obj.startDate && datetime < obj.endDate){ 
       alert('Falls within period'); 
      } else { 
       alert('Not within any period'); 
      } 
    } 
</script> 

+0

'obj.startDate' - это просто строка. Возможно, вы захотите сделать 'new Date (obj.startDate)' и т. Д., Чтобы получить фактические даты из строк. Тогда, по-видимому, будет работать сравнение между датами. –

+0

@HunanRostomyan Вы имеете в виду это: 'if (datetime> new Date (obj.startDate) && datetime Harry

+0

Попробуйте этот фрагмент кода из моего ответа. У него есть console.log вместо предупреждения, но все остальное должно быть одинаковым. –

ответ

3

Основная идея состоит в том, чтобы преобразовать строки даты в фактические объекты Date, чтобы их можно было сравнить с текущей датой (new Date()). Начнем с определения вспомогательной функции, которая при инициализации закрывается по текущей дате, создавая функцию, которая принимает дату начала и дату окончания, либо в String, либо в форме Date, и возвращает true тогда и только тогда, когда закрытая текущая дата находится в диапазоне.

Определение.

//() -> (([String|Date] * [String|Date]) -> Boolean) 
// When initialized, closes over the current date and returns 
// a predicate on String or Date objects. 
function includesNow() { 
    var curDate = new Date(); 
    return function(start, end) { 
    var startDate = (typeof start === "string") 
     ? new Date(start) : start; 
    var endDate = (typeof end === "string") 
     ? new Date(end) : end; 
    return (curDate > startDate) && (curDate < endDate); 
    }; 
} 

Usage.

С помощью вспомогательной функции, мы можем довольно легко отфильтровать «текущую» дату:

// Get the list of (date string) objects. 
var allDates = data.period.startend; 

// Capture the current date, returning the date range comparator. 
var comparator = includesNow(); 

// Get the list of those (date string) objects `obj` 
// that satisfy `comparator(obj.startDate, obj.endDate) === true`. 
var currentDates = allDates.filter(function(obj) { 
    return comparator(obj.startDate, obj.endDate); 
}); 

// This is a function of current date, so will be empty at some point. 
currentDates[0]; 
// => Object {startDate: "2015-11-17 15:43:37", endDate: "2015-11-18 19:43:37"} 

Если вы знаете, что ваши объекты будут всегда Струна и никогда фактическая дата объекты, то вы можете упростить includesNow изрядно. Если вас интересует замкнутый диапазон, обязательно замените > и < на ≥ и ≤, соответственно.

+0

Итак, я заменяю мой цикл for этим? Пробовал, но не побежал. Моя неудача или я ошибаюсь? – Harry

+0

@Harry Попробуйте сейчас. –

+0

Большое спасибо Хунань за ваш вклад. Как я, наконец, использую его с помощью инструкции if else, чтобы дать правильное предупреждение? – Harry

0

дата JSON не является объектом даты. Это строка. Вы пытаетесь сравнить Date obj с String.

Если дата в формате JSON был ISO отформатированные даты вы можете сделать:

var dateStr = JSON.parse(date); 
var realDate = new Date(dateStr); 

realDate теперь будет иметь объект даты JS. К сожалению, в вашем примере startDate и endDate не являются строками ISO.

Это было бы самое простое/чистое решение. В противном случае вы всегда можете получить строки даты JSON и разбить их на substring() и преобразовать годы/месяцы/дни с помощью Number(); а затем сравнить их таким образом?

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