Каким типом данных является DateTime в C#?

«Каким типом данных является DateTime в C#?» — вопрос из категории C# Core, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DateTime в C# — это структура (struct), то есть значимый тип (value type). Она определена в пространстве имен System и представляет собой момент времени, обычно выраженный как дата и время суток.

Ключевые характеристики:

  • Диапазон значений: От полуночи 1 января 0001 года до 23:59:59 31 декабря 9999 года.
  • Точность: Выражается в тиках (ticks), где 1 тик = 100 наносекунд.
  • Представление: Может хранить время как локальное (Local), всемирное координированное (UTC) или неопределенное (Unspecified).

Примеры создания и использования:

// Текущая дата и время (локальные)
DateTime nowLocal = DateTime.Now;

// Текущее время в UTC (предпочтительно для хранения и межсерверного взаимодействия)
DateTime nowUtc = DateTime.UtcNow;

// Создание конкретной даты
var birthDate = new DateTime(1990, 5, 15); // 15 мая 1990 года
var meetingTime = new DateTime(2023, 10, 27, 14, 30, 0); // 27.10.2023 14:30:00

// Операции с датами
DateTime tomorrow = DateTime.Today.AddDays(1);
TimeSpan duration = meetingTime - nowLocal;
bool isLeapYear = DateTime.IsLeapYear(2024);

Важные особенности:

  1. Иммутабельность: Все методы, изменяющие DateTime (например, AddDays, AddHours), возвращают новый экземпляр структуры. Исходное значение не изменяется.

    DateTime date = new DateTime(2023, 1, 1);
    DateTime newDate = date.AddMonths(3); // date останется 01.01.2023
    Console.WriteLine(newDate); // Вывод: 01.04.2023
  2. Форматирование и парсинг:

    string isoString = nowUtc.ToString("o"); // "2023-10-27T12:34:56.789Z" (стандарт ISO 8601)
    bool success = DateTime.TryParse("2023-12-31", out DateTime result);
  3. Для работы с часовыми поясами используйте тип DateTimeOffset, который явно хранит смещение от UTC, или библиотеку TimeZoneInfo. DateTime сам по себе не содержит информации о часовом поясе, только флаг Kind (Utc, Local, Unspecified).

  4. Альтернатива для высокоточных измерений интервалов: Для замера времени выполнения кода используйте Stopwatch, а не разность DateTime.