Возврат следующей указанной c даты - PullRequest
0 голосов
/ 28 апреля 2020

Допустим, лотерея проводится дважды в неделю по средам и субботам в 20:00. Я пишу функцию, которая вычисляет и возвращает следующую действительную дату отрисовки на основе текущей даты и времени, а также на необязательном предоставленном параметре даты и времени.

Я написал функцию, подобную приведенной ниже, но как я могу улучшить это ? Например, как я могу избежать использования getSpecificDay(lotteryDrawDate, 6) дважды?

function getLotteryDrawDate(date) {
    var lotteryDrawDate = new Date(date || new Date());
    if (lotteryDrawDate.getDay() < 4) {
        // get next wednesday
        getSpecificDay(lotteryDrawDate, 3);

        // get next saturday
        if (lotteryDrawDate.getHours() >= 20) {
            getSpecificDay(lotteryDrawDate, 6);
        }
    } else {
        // get next saturday
        getSpecificDay(lotteryDrawDate, 6);
    }
    lotteryDrawDate.setHours(20, 00, 00);
    return lotteryDrawDate.toLocaleString();
}

function getSpecificDay(lotteryDrawDate, iterator) {
    return lotteryDrawDate.setDate(lotteryDrawDate.getDate() + (iterator - lotteryDrawDate.getDay()));
}

var tomorrow = new Date();
tomorrow.setDate(new Date().getDate() + 1);

var nextThursday = new Date();
nextThursday.setDate(new Date().getDate() + 3);

console.log(getLotteryDrawDate(new Date()));
console.log(getLotteryDrawDate(tomorrow));
console.log(getLotteryDrawDate(nextThursday));
console.log(getLotteryDrawDate(new Date("2020-04-22 21:00")))

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

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

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

function getNextDraw(date = new Date()) {
   let d = new Date(+date);
   
   // If after 8 pm, set to midnight, i.e. next day 00:00:00
   if (d.getHours > 19) {
     d.setHours(24,0,0,0);
   }
   
   // Set time to 8 pm
   d.setHours(20,0,0,0);
   
   // Get the day of the week
   let day = d.getDay();
   
   // If Sun to Tue, set to Wed
   if (day < 3) {
     d.setDate(d.getDate() + 3 - day);
     
   // If Thu to Fri, set to Sat
   } else if (day > 3 && day < 6) {
     d.setDate(d.getDate() + 6 - day);
   }
   
   // Otherwise, already set to Wed or Sat
   return d;
}

// One week's worth of dates
for (let date = new Date(2020,3,27), i=0; i<7; i++) {
  console.log(date.toString().substr(0,24) + ' : ' + getNextDraw(date).toString().substr(0,24));
  date.setDate(date.getDate() + 1);
}

Краткая, но не требующая обслуживания версия:

function getNextDraw(date = new Date()) {
  let d = new Date(+date);
  d.setHours(d.getHours() < 20? 20 : 24,0,0,0);
  d.setDate(d.getDate() + Math.ceil((d.getDay()||1)/3)*3 - d.getDay());
  return d;
}

// One week's worth of dates
for (let date = new Date(2020,3,27), i=0; i<7; i++) {
  console.log(date.toString().substr(0,24) + ' : ' + getNextDraw(date).toString().substr(0,24));
  date.setDate(date.getDate() + 1);
}
0 голосов
/ 28 апреля 2020
You can use momentjs in this case.

function getSpecificDay(lotteryDrawDate, iterator) {
    var currentday=new Date().getDay(); 
    var daysLeftInLottery= iterator-currentday;
    return lotteryDrawDate.setDate(moment().add(daysLeftInLottery,'d'));
}
For more detail on monmentjs https://momentjs.com/docs/

...