@HAtan

Как правильно написать календарь со кастомным исчислением?

Добрый вечер. Задача вроде звучит просто, но видимо для меня не очень.
Проблема у меня в том как правильно подойти к созданию календаря. Создавать ли объект в котором будут храниться все года/месяцы/дни. И по мере его заполнения проверять год високосный или нет и добавлять день.

Пока у меня есть какая то муть для того что бы получить 1год - не високосный и проверка на високосный, пока все разрозненно. Не знаю двигаюсь в правильном направлении или нет. Надеюсь на советы, заранее спасибо.

let year = {};

    for (m=1;m<=12;m++){
        year[m] = {};
    }

    var x = 0;
    $.each(year, function(index, value) {
        for (d = 1; d<=30; d++){
            value[d] = ++x;
            if (x === 7){
                x = 0;
            }
        }
    });

function isLeapYear (year) {
        return year%5 === 0 && (0 !== year%100 || year%500 === 0);
    }


Задачка звучит так.
На планете Хронос празднуется тысячелетие основания колонии, сегодня 24 августа 1001 года, вторник. В день основания тоже был вторник.

Календарь Хроноса похож на земной: 12 месяцев по 30 дней, в феврале високосного года 31 день. Год является високосным, если его номер кратен 5, однако из кратных 100 високосными являются лишь кратные 500, например, 700, 800 и 900 — невисокосные года, 1000 — високосный.

Необходимо написать функцию, которая находит день недели на Хроносе для любой заданной даты.
  • Вопрос задан
  • 294 просмотра
Решения вопроса 1
WblCHA
@WblCHA
Зачем так сложно? Тебе достаточно посчитать количество дней с начала отсчёта и получить остаток от деления на 7.
(() => {
  const DAYS_IN_MONTH = 30;
  const DAYS_IN_YEAR = DAYS_IN_MONTH * 12;
  const LEAP_YEAR_BONUS_DAYS = 1;
  const DAYS_OF_WEEK = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
  
  
  const getDayOfWeek = (year, month, day) => {
    let daysCount = (year - 1) * DAYS_IN_YEAR + (month - 1) * DAYS_IN_MONTH + day;
    daysCount += getAllLeapYearBonusDays(month > 2 ? year : year - 1);
    
    return DAYS_OF_WEEK[daysCount % 7];
  };
  
  const getAllLeapYearBonusDays = (year) => (~~(year / 5) - ~~(year / 100) + ~~(year / 500)) * LEAP_YEAR_BONUS_DAYS;
  
  return getDayOfWeek(1001, 8, 24); // Tuesday
  return getDayOfWeek(1, 8, 24); // Tuesday
})()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SummerWeb Ярославль
от 120 000 до 180 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Market-place Ростов-на-Дону
от 100 000 до 200 000 ₽