Skip to content

Latest commit

 

History

History
129 lines (95 loc) · 8.79 KB

File metadata and controls

129 lines (95 loc) · 8.79 KB

📅 DateTime

Класс для работы с датой и временем, вдохновлённый 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"). Некорректные строки вызовут исключение.