Как получить текущую программу из временных диапазонов

Допустим, у меня есть файл JSON, как это

[
    {
        "programId": "bla-bla-1",
        "programTitle": "bla bla 1",
        "programImg": "bla1.jpg",
        "startsAt": "Apr 05 2017 11:00:00 GMT+0200 (EET)",
        "endsAt": "Apr 05 2017 12:00:00 GMT+0200 (EET)"
    },
    {
        "programId": "bla-bla-2",
        "programTitle": "bla bla 2",
        "programImg": "bla2.jpg",
        "startsAt": "Apr 05 2017 12:00:00 GMT+0200 (EET)",
        "endsAt": "Apr 05 2017 14:00:00 GMT+0200 (EET)"
    },
    {
        "programId": "bla-bla-3",
        "programTitle": "bla bla 3",
        "programImg": "bla3.jpg",
        "startsAt": "Apr 05 2017 14:00:00 GMT+0200 (EET)",
        "endsAt": "Apr 05 2017 16:00:00 GMT+0200 (EET)"
    }
]

И текущее время (05.04.2017 12:30:00 GMT + 0200 (EET)), как я могу получить текущую программу из этих временных диапазонов, используя Javascript, а также я могу использовать библиотеку, как momentJS

2 ответа

Решение

Вы можете сделать что-то вроде этого:

var obj = [ { "programId": "bla-bla-1", "programTitle": "bla bla 1", "programImg": "bla1.jpg", "startsAt": "Apr 05 2017 11:00:00 GMT+0200 (EET)", "endsAt": "Apr 05 2017 12:00:00 GMT+0200 (EET)" }, { "programId": "bla-bla-2", "programTitle": "bla bla 2", "programImg": "bla2.jpg", "startsAt": "Apr 05 2017 12:00:00 GMT+0200 (EET)", "endsAt": "Apr 05 2017 14:00:00 GMT+0200 (EET)" }, {"programId": "bla-bla-3", "programTitle": "bla bla 3", "programImg": "bla3.jpg", "startsAt": "Apr 05 2017 14:00:00 GMT+0200 (EET)", "endsAt": "Apr 05 2017 16:00:00 GMT+0200 (EET)"}];

var now = new Date("Apr 05 2017 12:30:00 GMT+0200 (EET)").getTime();//new Date().getTime();

var prog = obj.find(o => {
  return (now >= new Date(o.startsAt).getTime() && now <= new Date(o.endsAt).getTime());
});

console.log(prog);

Обратите внимание, что решение, данное Tisus, может работать не во всех браузерах, поскольку разбор даты нестандартной строки зависит от системы.

Я предлагаю проанализировать ваш вход с помощью moment(String, String) вместо new Date(String), Тогда вы можете использовать момент isBetween проверить, находится ли текущий день в заданном диапазоне.

Вот живой пример:

var input = [
    {
        "programId": "bla-bla-1",
        "programTitle": "bla bla 1",
        "programImg": "bla1.jpg",
        "startsAt": "Apr 05 2017 11:00:00 GMT+0200 (EET)",
        "endsAt": "Apr 05 2017 12:00:00 GMT+0200 (EET)"
    },
    {
        "programId": "bla-bla-2",
        "programTitle": "bla bla 2",
        "programImg": "bla2.jpg",
        "startsAt": "Apr 05 2017 12:00:00 GMT+0200 (EET)",
        "endsAt": "Apr 05 2017 14:00:00 GMT+0200 (EET)"
    },
    {
        "programId": "bla-bla-3",
        "programTitle": "bla bla 3",
        "programImg": "bla3.jpg",
        "startsAt": "Apr 05 2017 14:00:00 GMT+0200 (EET)",
        "endsAt": "Apr 05 2017 16:00:00 GMT+0200 (EET)"
    }
]

var prog = input.find(item => {
  //var now = moment();
  // mocking current time in order to get always the same result
  var now = moment("Apr 05 2017 12:30:00 GMT+0200 (EET)", 'MMM DD YYYY HH:mm:ss Z')
  var start = moment(item.startsAt, 'MMM DD YYYY HH:mm:ss Z');
  var end = moment(item.endsAt, 'MMM DD YYYY HH:mm:ss Z');
  return now.isBetween(start, end);
});

console.log(prog);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


В качестве примечания: я согласен с Раджешем: предоставление кода поможет получить лучшие ответы и даст вам возможность лучше учиться.

Другие вопросы по тегам