Найдите воскресенье между двумя датами в Javascript

В США христианский праздник Крещения проходит в воскресенье со 2 по 8 января (включительно). Я пытаюсь использовать Javascript, чтобы узнать, на какую дату он выпадает. Вроде должно работать, но ничего не получаю:

var startDate = new Date(2018,0,2);
var endDate = new Date(2018,0,8);
var epiphanyUS = new Date();

while (startDate < endDate){
  if (startdate.getDay() === 0){
    epiphanyUS = startdate;
  }
  startDate.setDate(startDate.getDate() + 1);
}
console.info("Epiphany is" + epiphanyUS.format("MM-DD-YYYY"));

Во-первых, это опечатка: startdate и epiphanyUS должны быть объявлены с ключевым словом var или подобным.

jmargolisvt 17.06.2018 19:47

и вы не используете операторы return внутри циклов.

kiddorails 17.06.2018 19:48

Откуда вы возвращаете epiphanyUS? И зачем ты его возвращаешь? Вы уже устанавливаете его внутри оператора if. Вы видите ошибку во фрагменте?

Sebastian Simon 17.06.2018 19:48

@kiddorails - Спасибо, я не расслышал.

Brent 17.06.2018 19:52

Теперь вам нужно только исправить опечатку startdate vs. startDate, как указано в первом комментарии.

Sebastian Simon 17.06.2018 19:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
137
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы должны использовать break, когда найдете совпадение. Это позволит вам выйти из петли.

var startDate = new Date(2018,0,2);
var endDate = new Date(2018,0,8); 
var epiphanyUS; // you should also define the variable you intend to use later.
    
while (startDate <= endDate){ // inclusive of endDate
  if (startDate.getDay() === 0){
    epiphanyUS = startDate; // fix the typo. It's startDate, not startdate
    break; // break when match is found.
  }
  startDate.setDate(startDate.getDate() + 1);
}
// check for presence and do stuff accordingly, like console.info
if (epiphanyUS) console.info("Epiphany is " + epiphanyUS);

Кроме того, условие < должно быть <=, поскольку даты указаны включительно (или дату окончания следует изменить на 9 января). Вы также можете выйти из цикла, используя while (startDate <= endDate && typeof epiphanyUS == 'undefined'), !epiphanyUS или аналогичные.

RobG 18.06.2018 07:19

@RobG - оператор возврата не должен использоваться имел в виду исходный код OP, в котором он использовал оператор return внутри условного выражения (без функции включения), обратитесь к редактированию.

kiddorails 18.06.2018 07:22

Отредактировал свой комментарий. Ваш комментарий к оператору return теперь является избыточным, поэтому вам, вероятно, следует отредактировать ответ. Я просто указывал, что есть другие способы выйти из цикла, кроме перерыв. ;-)

RobG 18.06.2018 07:26
Ответ принят как подходящий

Я исправил пару опечаток и явно определил все ваши переменные. Я думаю, что ваша логика цикла while тоже могла бы быть чище. Я не знаю, используете ли вы внешнюю библиотеку JS (момент?), Но .format - это не тот метод, с которым я знаком. Наконец, я добавил переменную года, чтобы вы могли быстро изменить ее, чтобы найти прозрение в любой другой год.

var year = 2018;
var startDate = new Date(year,0,2);
var endDate = new Date(year,0,8);
var epiphanyUS;

while (startDate <= endDate) {
    if (startDate.getDay() === 0) {
        epiphanyUS = startDate;
        break;
    } else {
        startDate.setDate(startDate.getDate() + 1);
    }
}

console.info("Epiphany is " + epiphanyUS.toDateString());

Поскольку в OP говорится, что даты включают, условие должно быть startDate <= endDate на ответ Бретта.

RobG 18.06.2018 07:04

var startDate = new Date(2018,0,2);
var endDate = new Date(2018,0,8);
var epiphanyUS;
    
while (startDate < endDate){
  if (startDate.getDay() === 0){
    epiphanyUS = startDate;
  }
  startDate.setDate(startDate.getDate() + 1);
}
function format(date) {
  var year = date.getFullYear();

  var month = (1 + date.getMonth()).toString();
  month = month.length > 1 ? month : '0' + month;

  var day = date.getDate().toString();
  day = day.length > 1 ? day : '0' + day;
  
  return month + '/' + day + '/' + year;
}
console.info("Epiphany is " + format(epiphanyUS));

Остерегайтесь опечаток в использовании заглавных букв, таких как startDate и startdate.

Вы также можете заключить свою логику в функцию, если предпочитаете использовать операторы возврата.

var startDate = new Date(2018,0,2);
var endDate = new Date(2018,0,8);

function getEpiphanyUS (startDate, endDate) {

  while (startDate <= endDate) {
    if (startDate.getDay() === 0){
      return startDate
    }
    startDate.setDate(startDate.getDate() + 1);
  }

}

var epiphanyUS = getEpiphanyUS (startDate, endDate)
console.info("Epiphany is " + epiphanyUS.toDateString());

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

/* @param {number} year - year to get epiphany for. Defaults to current year
** @returns {Date} First Sunday on or after 2 January for given year
*/
function getEpiphanyUS(year = new Date().getFullYear()) {
  var d = new Date(year, 0, 2);
  d.setDate(d.getDate() + ((7 - d.getDay()) % 7));
  return d;
}

// Test 2018 + next 9 years
for (var i=0; i<10; i++) {
  console.info(getEpiphanyUS(2018 + i).toString());
}

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