Для работы с датами и временем в .NET нам нужно использовать структуру DateTime. Он представляет дату и время с 00:00:00 1 января 0001 г. до 23:59:59 31 декабря 9999 г.

Вы также можете использовать конструктор для создания нового объекта DateTime. Пустой конструктор создает начальную дату:

1 DateTime dateTime = new DateTime();

2 Console.WriteLine(dateTime); // 01.01.0001

То есть мы получим минимально возможное значение, которое также можно получить следующим образом:

1 Console.WriteLine(DateTime.MinValue);

Для установки конкретной даты необходимо использовать один из конструкторов, принимающих параметры:

1 DateTime date1 = new DateTime(2022, 08, 28); // year - month - day

2 Console.WriteLine(date1); // 28.08.2022

Установка времени:

1 DateTime date1 = new DateTime(2022, 8, 28, 18, 30, 25); // year- month - day - hour - minute - second

2 Console.WriteLine(date1); // 28.08.2022 15:32:49

Если вы хотите получить текущее время и дату, вы можете использовать ряд свойств DateTime:

1 Console.WriteLine(DateTime.Now);

2 Console.WriteLine(DateTime.UtcNow);

3 Console.WriteLine(DateTime.Today);

Вывод консоли:

28.08.2022 11:43:33
28.08.2022 8:43:33
28.08.2022 0:00:00

Свойство DateTime.Now принимает текущую дату и время компьютера, DateTime.UtcNow — дату и время относительно среднего времени по Гринвичу (GMT), а DateTime.Today — только текущую дату.

При работе с датами имейте в виду, что по умолчанию для представления дат используется григорианский календарь. Но что произойдет, если мы захотим получить день недели для 5 октября 1582 года:

1 DateTime someDate = new DateTime(1582, 10, 5);

2 Console.WriteLine(someDate.DayOfWeek)

Консоль выделит значение вторника. Однако, как может быть известно из истории, первый переход с юлианского календаря на григорианский произошел в октябре 1582 года. Затем после даты 4 октября (четверг) (по юлианскому календарю) сразу перешли на 15 октября (пятница) (по григорианскому календарю). Так что, по факту, 10 дней было скинуто. То есть после 4 октября было 15 октября.

В большинстве случаев этот факт вряд ли повлияет на расчеты, но при работе с очень старыми датами этот аспект следует учитывать.

Операции с DateTime

Основные операции со структурой DateTime связаны со сложением или вычитанием дат. Например, вам нужно прибавить или вычесть несколько дней к дате.

Для добавления дат используется ряд методов:

• Добавить(значение TimeSpan): добавляет к дате значение TimeSpan.

• AddDays(двойное значение): добавляет несколько дней к текущей дате.

• AddHours(двойное значение): добавляет несколько часов к текущей дате.

•AddMinutes(двойное значение): добавляет несколько минут к текущей дате.

• AddMonths(int value): добавляет несколько месяцев к текущей дате.

• AddYears(int value): добавляет несколько лет к текущей дате.

Например, добавьте 3 часа к какой-либо дате:

1 DateTime date1 = new DateTime(2022, 8, 28, 18, 30, 25); // 28.08.2022 18:30:25

2 Console.WriteLine(date1.AddHours(3)); // 28.08.2022 21:30:25

Метод Subtract(DateTime date) используется для вычитания дат:

1 DateTime date1 = new DateTime(2022, 8, 28, 18, 30, 25); // 28.08.2022 18:30:25

2 DateTime date2 = new DateTime(2022, 8, 28, 15, 30, 25); // 28.08.2022 15:30:25

3 Console.WriteLine(date1.Subtract(date2)); // 03:00:00

Здесь даты отличаются на три часа, поэтому результат «03:00:00».

Метод Substract не позволяет отдельно вычитать дни, часы и т. д. Но в этом нет необходимости, потому что мы можем передавать отрицательные значения в метод AddDays() и другие методы добавления:

1 // subtract three hours

2 DateTime date1 = new DateTime(2022, 8, 28, 18, 30, 25); // 28.08.2022 18:30:25

3 Console.WriteLine(date1.AddHours(-3)); // 28.08.2022 15:30:25

Помимо операций сложения и вычитания, существует ряд методов форматирования даты:

1 DateTime date1 = new DateTime(2022, 8, 28, 18, 30, 25);

2 Console.WriteLine(date1.ToLocalTime()); // 28.08.2022 21:30:25

3 Console.WriteLine(date1.ToUniversalTime()); // 28.08.2022 15:30:25

4 Console.WriteLine(date1.ToLongDateString()); // August 28th 2022

5 Console.WriteLine(date1.ToShortDateString()); // 28.08.2022

6 Console.WriteLine(date1.ToLongTimeString()); // 18:30:25

7 Console.WriteLine(date1.ToShortTimeString()); // 18:30