Класс для работы с датой и временем, вдохновлённый C# и Python. Поддерживает создание дат, манипуляции (следующий/предыдущий день, год), вычисление длительности и форматированный вывод. Использует TimeObject для хранения времени (часы, минуты, секунды). Поддерживает хэширование для использования в Dictionary. 🕒
DateTime(long long int year, unsigned long long int month, unsigned long long int day, unsigned short hours = 0, unsigned short minutes = 0, unsigned short seconds = 0)— создаёт дату с годом, месяцем, днём и временем (по умолчанию 00:00:00).DateTime(long long int year, unsigned long long int month, unsigned long long int day, TimeObject time)— создаёт дату с годом, месяцем, днём и объектомTimeObjectдля времени.DateTime(const String& date_str)— создаёт дату из строки (формат ожидается корректный, например, "2025.07.30" или "2025.07.30 14:30:00").DateTime()— создаёт текущую дату и время, эквивалентноDateTime::Now().
Day()— возвращает день месяца (1–31).Month()— возвращает месяц (1–12).Year()— возвращает год.Hours()— возвращает часы (0–23).Minutes()— возвращает минуты (0–59).Seconds()— возвращает секунды (0–59).NextDay()— возвращает дату следующего дня (⚠️ не учитывает время).PreviousDay()— возвращает дату предыдущего дня (⚠️ не учитывает время).NextYear()— возвращает дату через год (⚠️ не учитывает время).Now()— статический метод, возвращает текущую дату и время.ToString(bool need_time = true, String delim = ".")— форматирует дату как строку (например, "2025.07.30" или "2025.07.30 14:30:00" с временем).DaysTillBirthday(DateTime birthday)— возвращает количество дней до дня рождения (⚠️ не учитывает время, сравнивает только даты).Duration(DateTime second_date)— возвращает разницу в днях между датами (⚠️ не учитывает время).AbsoluteDays()— возвращает количество дней от условного нуля (⚠️ не учитывает время).DaysInYear()— возвращает количество дней в текущем году (365 или 366 для високосного).DaysInMonth()— возвращает количество дней в текущем месяце (28–31).IsEndOfMonth()— проверяет, является ли день последним в месяце.IsLastMonth()— проверяет, является ли месяц декабрём.IsEndOfYear()— проверяет, является ли дата последним днём года.IsLeap()— проверяет, високосный ли год.GetHash()— возвращает хэш даты (черезToString().GetHash()).
⚠️ Заметка: МетодыNextDay,PreviousDay,NextYear,DaysTillBirthday,Duration,AbsoluteDaysигнорируют время (hours,minutes,seconds) и работают только с датой (year,month,day). Для учёта времени требуется дополнительная логика.
==— сравнивает даты (год, месяц, день; время игнорируется).<<— выводит дату в поток как строку черезToString().
💡 TimeObject: Внутренняя структура для времени, поддерживает сравнение (
==,!=,<,>,<=,>=). Используется в конструкторе и методахHours,Minutes,Seconds.
Создаём дату, добавляем в словарь и выводим.
#include "cs/types.h"
int main() {
DateTime now = DateTime::Now();
DateTime event(2025, 7, 30);
std::cout << now.ToString() << '\n'; // Текущая дата и время, например, 2025.08.01 08:57:00
std::cout << event.ToString(false) << '\n'; // Приведение к строке без времени: 2025.07.30
std::cout << "Дней до события: " << now.Duration(event) << '\n'; // Разница в днях
std::cout << "Следующий день: " << event.NextDay().ToString() << '\n'; // 2025.07.31 00:00:00
std::cout << "Високосный? " << event.IsLeap() << '\n'; // false
}Работа с датами, временем, вычислением длительности и проверкой високосного года.
#include "cs/types.h"
int main() {
// Создаём словарь с датами и описаниями событий
Dictionary<DateTime, String> events;
// Добавляем события
DateTime event1(2025, 7, 30, 14, 30, 0);
events[event1] = "Встреча с пацанами";
DateTime event2 = DateTime::Now();
events[event2] = "Текущий момент";
DateTime event3("2026.12.31 23:59:59");
events[event3] = "Новый год!";
// Добавляем день рождения
DateTime birthday(1995, 8, 15);
events[birthday] = "День рождения";
// Выводим события
print("События:");
print(events);
// Проверяем длительность и високосный год
print("Дней до Нового года: " + String(events[event3].Duration(event2)));
print("2025 високосный? " + String(event1.IsLeap())); // false
print("Дней до дня рождения: " + String(event2.DaysTillBirthday(birthday)));
// Манипуляции с датами
DateTime next_day = event1.NextDay();
print("Следующий день после встречи: " + next_day.ToString()); // 2025.07.31
print("Дней в июле 2025: " + String(event1.DaysInMonth())); // 31
// Проверяем конец года
print("31.12.2026 — конец года? " + String(event3.IsEndOfYear())); // true
}💡 Что происходит? Словарь использует
DateTimeкак ключ, что требует корректного хэширования (GetHash) и сравнения (==). МетодыDurationиDaysTillBirthdayигнорируют время, работая только с датами.ToStringформатирует вывод, включая время, если нужно.IsLeapиDaysInMonthдемонстрируют работу с високосными годами и месяцами.
- UTF-8 совместимость: Метод
ToStringвозвращает строку, совместимую сStringи UTF-8. - Гибкость времени: Поддержка времени через
TimeObject, но методы вродеDurationиNextDayигнорируют его (⚠️ см. заметку выше). - Хэширование:
DateTimeможно использовать как ключ вDictionaryблагодаряstd::hash<DateTime>. - Потоковый вывод: Вывод через
<<используетToString()для форматирования. - Проверки корректности: Внутренние методы
_check_date_partи_check_time_partгарантируют валидность даты и времени. - Високосные годы: Поддержка через
IsLeapиDaysInYear.
⚠️ Ограничение: Для парсинга строк вDateTime(const String& date_str)ожидается строгий формат (например, "YYYY.MM.DD" или "YYYY.MM.DD HH:MM:SS"). Некорректные строки вызовут исключение.