Продвинутый калькулятор дат
«Онлайн-калькулятор дат для точных расчетов. Узнайте, сколько дней осталось до события, прибавьте к дате нужный интервал или определите день недели для любой даты. Просто введите даты — и получите результат мгновенно!»
Рассчитывайте разницы, добавляйте интервалы и определяйте дни недели.
Исходный код доступен в конце страницы.
Календарь
Июль 2024
Продвинутый калькулятор дат- это удобный инструмент для работы с датами, который поможет:
- Рассчитать разницу между двумя датами (дни, недели, месяцы, годы).
- Прибавить или вычесть дни, месяцы, годы к любой дате.
- Определить день недели (например, узнать, на какой день выпадет ваш День рождения).
- Визуально выбирать даты в компактном календаре.
Адаптивный дизайн — корректно отображается на телефонах и компьютерах.
Исходный код продвинутого калькулятора дат:
HTML:
<div class="vifed-container"> <!-- Вкладки --> <div class="vifed-tabs"> </div> <!-- Блок "Разница между датами" --> <div class="vifed-tab-content active" id="difference"> <div class="vifed-date-inputs"> <div> <input type="date" id="vifed-start-date"> </div> <div> <input type="date" id="vifed-end-date"> </div> </div> </div> <!-- Блок "Прибавить/вычесть" --> <div class="vifed-tab-content" id="add-subtract"> <div class="vifed-date-inputs"> <div> <input type="date" id="vifed-base-date"> </div> <div class="vifed-interval-controls"> <div> <select id="vifed-operation"> </select> </div> <input type="number" id="vifed-days" min="0" placeholder="Дни"> <input type="number" id="vifed-months" min="0" placeholder="Месяцы"> <input type="number" id="vifed-years" min="0" placeholder="Годы"> </div> </div> </div> <!-- Блок "День недели" --> <div class="vifed-tab-content" id="day-week"> <div class="vifed-date-inputs"> <div> <input type="date" id="vifed-check-date"> </div> </div> </div> <!-- Мини-календарь --> <div class="vifed-calendar"> <div class="vifed-calendar-header"> </div> </div> </div>
CSS:
/* Основные стили */ .vifed - container { max - width: 800 px; margin: 0 auto; background: #ffffff; padding: 30 px; border - radius: 5 px; box - shadow: 0 5 px 15 px rgba(0, 0, 0, 0.1); font - family: 'Segoe UI', Tahoma, Geneva, Verdana, sans - serif; } .vifed - container h1 { color: #2c5364; text-align: center; margin-bottom: 20px; } .vifed-description { text-align: center; margin-bottom: 30px; color: # 666; } /* Вкладки */ .vifed - tabs { display: flex; gap: 5 px; margin - bottom: 20 px; border - bottom: 1 px solid# ddd; } .vifed - tab { padding: 10 px 15 px; background: #f8f9fa; border: none; border - radius: 5 px 5 px 0 0; cursor: pointer; transition: all 0.3 s; } .vifed - tab.active { background: #2c5364; color: white; } .vifed-tab:hover:not(.active) { background: # e9ecef; } /* Контент вкладок */ .vifed - tab - content { display: none; padding: 20 px 0; } .vifed - tab - content.active { display: block; } /* Поля ввода дат */ .vifed - date - inputs { display: grid; grid - template - columns: 1 fr; gap: 15 px; margin - bottom: 20 px; } .vifed - date - inputs input[type = "date"] { padding: 10 px; border: 1 px solid# ddd; border - radius: 5 px; width: 100 % ; } .vifed - interval - controls { display: grid; grid - template - columns: 1 fr 1 fr; gap: 10 px; } .vifed - interval - controls input, .vifed - interval - controls select { padding: 10 px; border: 1 px solid# ddd; border - radius: 5 px; width: 100 % ; } /* Кнопки */ .vifed - calculate - btn { display: block; width: 100 % ; padding: 12 px; background: #2c5364; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 1.1rem; transition: background 0.3s; margin-bottom: 20px; } .vifed-calculate-btn:hover { background: # 3 a7bd5; } /* Результаты */ .vifed - result { padding: 15 px; background: #f8f9fa; border - radius: 5 px; font - size: 1.1 rem; text - align: center; } /* Календарь */ .vifed - calendar { margin - top: 30 px; border - top: 1 px solid# eee; padding - top: 20 px; } .vifed - calendar - header { display: flex; justify - content: space - between; align - items: center; margin - bottom: 15 px; } .vifed - calendar - header button { background: #2c5364; color: white; border: none; border-radius: 5px; padding: 5px 10px; cursor: pointer; } .vifed-calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; } .vifed-calendar-day { padding: 10px; text-align: center; border-radius: 5px; background: # f8f9fa; } .vifed - calendar - day.selected { background: #2c5364; color: white; } .vifed-calendar-day.other-month { opacity: 0.5; } /* Адаптивность */ @media (max-width: 600px) { .vifed-container { padding: 15px; } .vifed-tabs { flex-wrap: wrap; } .vifed-interval-controls { grid-template-columns: 1fr; } }
JavaScript:
// DOM элементы const tabs = document.querySelectorAll('.vifed-tab'); const tabContents = document.querySelectorAll('.vifed-tab-content'); // Элементы для "Разницы между датами" const startDateInput = document.getElementById('vifed-start-date'); const endDateInput = document.getElementById('vifed-end-date'); const calculateDifferenceBtn = document.getElementById('vifed-calculate-difference'); const differenceResult = document.getElementById('vifed-difference-result'); // Элементы для "Прибавить/вычесть" const baseDateInput = document.getElementById('vifed-base-date'); const daysInput = document.getElementById('vifed-days'); const monthsInput = document.getElementById('vifed-months'); const yearsInput = document.getElementById('vifed-years'); const operationSelect = document.getElementById('vifed-operation'); const calculateAddSubtractBtn = document.getElementById('vifed-calculate-add-subtract'); const addSubtractResult = document.getElementById('vifed-add-subtract-result'); // Элементы для "День недели" const checkDateInput = document.getElementById('vifed-check-date'); const calculateDayBtn = document.getElementById('vifed-calculate-day'); const dayResult = document.getElementById('vifed-day-result'); // Элементы календаря const prevMonthBtn = document.getElementById('vifed-prev-month'); const nextMonthBtn = document.getElementById('vifed-next-month'); const currentMonthYear = document.getElementById('vifed-current-month-year'); const calendarGrid = document.getElementById('vifed-calendar-grid'); // Текущая дата для календаря let currentDate = new Date(); // Инициализация document.addEventListener('DOMContentLoaded', () => { // Устанавливаем сегодняшнюю дату по умолчанию const today = new Date().toISOString().split('T')[0]; startDateInput.value = today; endDateInput.value = today; baseDateInput.value = today; checkDateInput.value = today; // Переключение вкладок tabs.forEach(tab => { tab.addEventListener('click', () => { tabs.forEach(t => t.classList.remove('active')); tabContents.forEach(c => c.classList.remove('active')); tab.classList.add('active'); document.getElementById(tab.dataset.tab).classList.add('active'); }); }); // Обработчики кнопок calculateDifferenceBtn.addEventListener('click', calculateDateDifference); calculateAddSubtractBtn.addEventListener('click', calculateAddSubtract); calculateDayBtn.addEventListener('click', calculateDayOfWeek); // Кнопки календаря prevMonthBtn.addEventListener('click', () => { currentDate.setMonth(currentDate.getMonth() - 1); renderCalendar(); }); nextMonthBtn.addEventListener('click', () => { currentDate.setMonth(currentDate.getMonth() + 1); renderCalendar(); }); // Первоначальная отрисовка календаря renderCalendar(); }); // Расчет разницы между датами function calculateDateDifference() { const startDate = new Date(startDateInput.value); const endDate = new Date(endDateInput.value); if (startDate > endDate) { differenceResult.textContent = 'Начальная дата должна быть раньше конечной!'; return; } const diffTime = Math.abs(endDate - startDate); const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); const diffWeeks = Math.floor(diffDays / 7); // Расчет месяцев и лет с учетом переполнений let years = endDate.getFullYear() - startDate.getFullYear(); let months = endDate.getMonth() - startDate.getMonth(); if (months < 0) { years--; months += 12; } differenceResult.innerHTML = ` <strong>Результат:</strong><br> Дней: ${diffDays}<br> Недель: ${diffWeeks}<br> Месяцев: ${months}<br> Лет: ${years} `; } // Прибавление/вычитание интервала function calculateAddSubtract() { const baseDate = new Date(baseDateInput.value); const days = parseInt(daysInput.value) || 0; const months = parseInt(monthsInput.value) || 0; const years = parseInt(yearsInput.value) || 0; const operation = operationSelect.value; const resultDate = new Date(baseDate); if (operation === 'add') { resultDate.setDate(resultDate.getDate() + days); resultDate.setMonth(resultDate.getMonth() + months); resultDate.setFullYear(resultDate.getFullYear() + years); } else { resultDate.setDate(resultDate.getDate() - days); resultDate.setMonth(resultDate.getMonth() - months); resultDate.setFullYear(resultDate.getFullYear() - years); } addSubtractResult.innerHTML = ` <strong>Новая дата:</strong><br> ${resultDate.toLocaleDateString('ru-RU')}<br> (${formatDayOfWeek(resultDate)}) `; } // Определение дня недели function calculateDayOfWeek() { const date = new Date(checkDateInput.value); dayResult.textContent = `День недели: ${formatDayOfWeek(date)}`; } // Форматирование дня недели function formatDayOfWeek(date) { const days = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота']; return days[date.getDay()]; } // Отрисовка календаря function renderCalendar() { const year = currentDate.getFullYear(); const month = currentDate.getMonth(); currentMonthYear.textContent = new Date(year, month, 1).toLocaleDateString('ru-RU', { month: 'long', year: 'numeric' }).replace(' г.', ''); const firstDay = new Date(year, month, 1).getDay(); const daysInMonth = new Date(year, month + 1, 0).getDate(); const daysInPrevMonth = new Date(year, month, 0).getDate(); calendarGrid.innerHTML = ''; // Дни недели (заголовки) const weekDays = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']; weekDays.forEach(day => { const dayElement = document.createElement('div'); dayElement.className = 'vifed-calendar-day'; dayElement.textContent = day; dayElement.style.fontWeight = 'bold'; calendarGrid.appendChild(dayElement); }); // Пустые ячейки перед первым днем месяца for (let i = 0; i < (firstDay === 0 ? 6 : firstDay - 1); i++) { const dayElement = document.createElement('div'); dayElement.className = 'vifed-calendar-day other-month'; dayElement.textContent = daysInPrevMonth - i; calendarGrid.appendChild(dayElement); } // Дни текущего месяца const today = new Date(); for (let i = 1; i <= daysInMonth; i++) { const dayElement = document.createElement('div'); dayElement.className = 'vifed-calendar-day'; dayElement.textContent = i; // Выделение сегодняшнего дня if (i === today.getDate() && month === today.getMonth() && year === today.getFullYear()) { dayElement.classList.add('selected'); } // Обработчик выбора даты dayElement.addEventListener('click', () => { document.querySelectorAll('.vifed-calendar-day').forEach(d => d.classList.remove('selected')); dayElement.classList.add('selected'); // Обновляем дату в активной вкладке const selectedDate = new Date(year, month, i); const dateString = selectedDate.toISOString().split('T')[0]; if (document.querySelector('.vifed-tab-content.active').id === 'difference') { if (!startDateInput.value || endDateInput.value) { startDateInput.value = dateString; } else { endDateInput.value = dateString; } } else if (document.querySelector('.vifed-tab-content.active').id === 'add-subtract') { baseDateInput.value = dateString; } else { checkDateInput.value = dateString; } }); calendarGrid.appendChild(dayElement); } // Пустые ячейки после последнего дня месяца const totalCells = Math.ceil((firstDay - 1 + daysInMonth) / 7) * 7; for (let i = 1; i <= totalCells - (firstDay - 1 + daysInMonth); i++) { const dayElement = document.createElement('div'); dayElement.className = 'vifed-calendar-day other-month'; dayElement.textContent = i; calendarGrid.appendChild(dayElement); } }