В США христианский праздник Крещения проходит в воскресенье со 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"));и вы не используете операторы return внутри циклов.
Откуда вы возвращаете epiphanyUS? И зачем ты его возвращаешь? Вы уже устанавливаете его внутри оператора if. Вы видите ошибку во фрагменте?
@kiddorails - Спасибо, я не расслышал.
Теперь вам нужно только исправить опечатку startdate vs. startDate, как указано в первом комментарии.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны использовать 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 - оператор возврата не должен использоваться имел в виду исходный код OP, в котором он использовал оператор return внутри условного выражения (без функции включения), обратитесь к редактированию.
Отредактировал свой комментарий. Ваш комментарий к оператору return теперь является избыточным, поэтому вам, вероятно, следует отредактировать ответ. Я просто указывал, что есть другие способы выйти из цикла, кроме перерыв. ;-)
Я исправил пару опечаток и явно определил все ваши переменные. Я думаю, что ваша логика цикла 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 на ответ Бретта.
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());
}
Во-первых, это опечатка:
startdateиepiphanyUSдолжны быть объявлены с ключевым словомvarили подобным.