This commit is contained in:
2026-03-26 03:53:54 +07:00
parent 073afde7c0
commit 0aac04e9bd
8 changed files with 201 additions and 78 deletions
+75
View File
@@ -0,0 +1,75 @@
export function formatRussianDate(dateStr: string): string {
// 1. Вытаскиваем только саму дату (2026-03-24) с помощью регулярного выражения
// Это защитит нас от багов с часовыми поясами при парсинге
const match = dateStr.match(/^(\d{4})-(\d{2})-(\d{2})/);
if (!match) {
throw new Error("Неверный формат входной строки");
}
// 2. Преобразуем строки в числа
const year = parseInt(match[1], 10);
const month = parseInt(match[2], 10);
const day = parseInt(match[3], 10);
// 3. Создаем объект даты (обратите внимание: в JS месяцы начинаются с 0, поэтому month - 1)
const dateObj = new Date(year, month - 1, day);
// 4. Словари для точного форматирования (родительный падеж для месяцев)
const monthsRu = [
"января", "февраля", "марта", "апреля", "мая", "июня",
"июля", "августа", "сентября", "октября", "ноября", "декабря"
];
// В JS 0 - это воскресенье, 1 - понедельник и т.д.
const weekdaysRu = [
"воскресенье", "понедельник", "вторник", "среда",
"четверг", "пятница", "суббота"
];
// 5. Получаем нужные значения
const monthName = monthsRu[dateObj.getMonth()];
const weekdayName = weekdaysRu[dateObj.getDay()];
// 6. Собираем итоговую строку
return `${weekdayName} ${day} ${monthName}`;
}
export function getRelativeDayName(dateStr: string): string {
// 1. Вытаскиваем только дату (например, 2026-03-24)
const match = dateStr.match(/^(\d{4})-(\d{2})-(\d{2})/);
if (!match) {
throw new Error("Неверный формат входной строки");
}
const year = parseInt(match[1], 10);
const month = parseInt(match[2], 10) - 1; // Месяцы в JS начинаются с 0
const day = parseInt(match[3], 10);
// 2. Создаем объект целевой даты и сбрасываем время в 00:00:00
const targetDate = new Date(year, month, day, 0, 0, 0, 0);
// 3. Создаем объект СЕГОДНЯШНЕЙ даты и тоже сбрасываем время в 00:00:00
const today = new Date();
today.setHours(0, 0, 0, 0);
// 4. Вычисляем разницу в миллисекундах и переводим в дни
// Используем Math.round, чтобы избежать багов при переходе на летнее/зимнее время
const diffInMs = targetDate.getTime() - today.getTime();
const diffInDays = Math.round(diffInMs / (1000 * 60 * 60 * 24));
// 5. Возвращаем результат в зависимости от разницы в днях
switch (diffInDays) {
case 0:
return "сегодня";
case 1:
return "завтра";
case 2:
return "послезавтра"; // бонус :)
case -1:
return "вчера"; // бонус :)
default:
// Если это не сегодня и не завтра, можно вернуть пустую строку,
// либо просто количество дней, либо отформатированную дату (как в прошлом ответе)
return "";
}
}