Получить следующее или последнее вхождение дня и месяца на основе сегодняшней даты в Javascript - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно определить, нахожусь ли я в весенний, летний или осенний период того или иного года, и отобразить журнал на основе этого.Периоды следующие:

Spring: 14th January - 6th May 
Summer: 7th May - 7th October
Autumn: 8th October - 13th January

Итак, сегодня (7 февраля) я в весеннем периоде (14 января 2019 г. - 6 мая 2019 г.) и показываю выпуск весны 2019 г.Однако предположим, что это Рождество 2019 года. Я буду в осеннем периоде (8 октября 2019 года - 13 января 2020 года), поэтому я буду показывать выпуск осени 2019 года, что означает, что следующие весенние и летние выпуски будут в 2020 году.

Я возился с датами JS и объектами моментов, чтобы попытаться установить текущие / следующие периоды на основе сегодняшнего дня, и я бы опубликовал здесь свой код, но я почти уверен, что он бесполезен.Это смена года за осенний период, который сбивает меня с толку.У кого-нибудь есть какие-нибудь библиотеки или предложения, которые могут помочь?Или я обдумываю это?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Это очень простое решение, без библиотек.Работает на вашу проблему как есть и на все последующие годы, только если даты одинаковы каждый год.

Если вы планировали иметь еще много проблем в год и запускать их несколько раз постоянно, то это можно переписатьпо-разному.

// you can completely ignore autumn because if it's not spring or summer it will be Autumn. 
// But I still put it to 2019 just in case you planned to use it with this method.
let issues = { "Spring": [new Date(2019, 0, 14), new Date(2019, 4, 6)],
               "Summer": [new Date(2019, 4, 7), new Date(2019, 9, 7)],
               "Autumn": [new Date(2019, 9, 8), new Date(2019, 0, 13)]
             }

// today is the day we are trying to find the correct issue for.
// Any date can be put here, just setFullYear to 2019, 2019 is arbitrary
let today = new Date().setFullYear(2019); 

// console.log the appropriate issue for today
if (issues.Summer[0] <= today && issues.Summer[1] >= today) {
    console.log("Summer");
} else if (issues.Spring[0] <= today && issues.Spring[1] >= today) {
    console.log("Spring");
} else {
    console.log("Autumn");
}

0 голосов
/ 08 февраля 2019

Как сказал Сэм, вы можете избежать смены года, просто сравнив другие сезоны текущего года.Если это не один из других, это должен быть перевернутый.

function getSeason(d) {
  // Default to today's date
  d = d || new Date();
  // Zero time part for comparison
  d.setHours(0,0,0,0);
  // Use the current year for comparisons
  var year = d.getFullYear();
  // Default season if others fail
  var season = 'Autumn';
  // Data for seasons, use ECMAScript month numbering
  var seasons = [
    {name: 'Spring', 
     start: [0, 14],  // Jan 14
     end: [4, 6]},    // May 06
    {name: 'Summer',
     start: [4, 7],   // May 07
     end: [9, 7]}     // Oct 07
  ];
  
  // Set season
  seasons.forEach(s => {
    let sStart = new Date(year, ...s.start);
    let sEnd = new Date(year, ...s.end);
    if (d >= sStart && d <= sEnd) {
      season = s.name;
    }
  })
  return season;
}

console.log('Today is : ' + getSeason());

[new Date(2019,0, 1), // 1 Jan Autumn
 new Date(2019,0,21), // 21 Jan Spring
 new Date(2019,5,30)  // 30 Jun Summer
].forEach(d => {
  console.log(d.toDateString()+ ': ' + getSeason(d));
});

Код может быть более кратким, используя новые функции:

function getSeason(d = new Date()) {
  d.setHours(0,0,0,0);
  let year = d.getFullYear();
  let seasons = [
    {name: 'Spring', start: [0, 14], end: [4, 6]},
    {name: 'Summer', start: [4, 7], end: [9, 7]}
  ];      
  return (seasons.find(s => d >= new Date(year, ...s.start) && d <= new Date(year, ...s.end)) || {name:'Autumn'}).name;
}

console.log('Today is : ' + getSeason());

[new Date(2019,0, 1), // 1 Jan Autumn
 new Date(2019,0,21), // 21 Jan Spring
 new Date(2019,5,30)  // 30 Jun Summer
].forEach(d => {
  console.log(d.toDateString()+ ': ' + getSeason(d));
});
0 голосов
/ 07 февраля 2019

Ответ изменен с здесь .Просто передайте объект текущего сезона и текущую дату (которая может быть простой var date = new Date()).Я не знаю библиотек, которые бы давали вам сезонные даты автоматически.Вам придется добавить некоторый код, который запускается по расписанию или выполняется в течение определенного сезона каждый год, чтобы обновить или перестроить объекты даты, чтобы они имели правильный год.

Если вы ищетеболее сложный способ сделать это без необходимости обновлять даты, проверить это сообщение

var spring = {};
spring.startDate = "02/01/2019"
spring.endDate = "02/09/2019"
var today = "02/07/2019"

function checkSeason(season, currentDate) {
  console.log(season.startDate)
  console.log(currentDate)

  var d1 = season.startDate.split("/");
  var d2 = season.endDate.split("/");
  var c = currentDate.split("/");

  var from = new Date(d1[2], parseInt(d1[1]) - 1, d1[0]); // -1 because months are from 0 to 11
  var to = new Date(d2[2], parseInt(d2[1]) - 1, d2[0]);
  var check = new Date(c[2], parseInt(c[1]) - 1, c[0]);

  if (check > from && check < to) {
    console.log("its in the season")
  }
}


checkSeason(spring, today)
...