Лекція 5. Операції з датою та часом в C#

 

Існують певні задачі коли потрібно прораховувати величини часу, а так як, є роки високосні, і є місяці з різною кількістю днів то простими циклами не обійтись. Для того були виведені спеціальні формули по яких можливо додавати та віднімати дати, та на базі яких і працюють методи середовища розробки, які будуть наведені нижче.

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

Для простоти наведених прикладів припускаємо, що ми працюємо в консолі. Нам для ілюстрації операцій з датами візуальні компоненти не потрібні.

Для створення нового об'єкта DateTime також можна використовувати конструктор. Порожній конструктор створює початкову дату:

DateTime date1 = new DateTime();

Console.WriteLine(date1); // 01.01.0001 0:00:00

 

Тобто ми отримаємо мінімально можливе значення, яке також можна отримати наступним чином:

Console.WriteLine(DateTime.MinValue);

 

Щоб задати конкретну дату, потрібно використати один з конструкторів, які приймають параметри:

DateTime date1 = new DateTime(2015, 7, 20); // рік - місяць - день

Console.WriteLine(date1); // 20.07.2015 0:00:00

 

Якщо потрібно, при ініціалізації, додатково встановити час, тоді, потрібно, використати такий варіант виклику:

DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // рік - місяць - день - години - хвилини - секунди

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

 

Якщо необхідно отримати поточну час і дату, то можна використати ряд властивостей DateTime:

Console.WriteLine(DateTime.Now);

 

Встановлює поточну дату і час включаючи часовий пояс країни встановлений в налаштуваннях операційної системи

Примітка: в C# всі локальні налаштування називаються «Культурне середовище». Це набір комплексних параметрів середовища в якому живе і перебуває користувач (наприклад: часовий пояс, письмо зліва-на-право чи справа-на-ліво, грошові одиниці, правила написання чисел і т.д.).

Console.WriteLine(DateTime.UtcNow);

 

Буде встановлено світовий час (так званий, середній час по Гринвічу, який не має а ні літнього, а ні зимового переводу годин)

 

Console.WriteLine(DateTime.Today);

 

Буде встановлено сьогоднішню дату (початок доби, години хвилини та секунди будуть записані нулями)

В консолі виведеться:

20.07.2015 10:43:33

20.07.2015 8:43:33

20.07.2015 0:00:00

 

При роботі з датами треба враховувати, що за замовчуванням для подання дат застосовується григоріанський календар. Але, що буде, якщо ми захочемо отримати день тижня для 5 жовтня 1582 року:

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

Console.WriteLine(someDate.DayOfWeek);

 

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

У більшості випадків, даний факт навряд чи якось вплине на обчислення, проте при роботі з дуже давніми датами даний аспект слід враховувати.

Операції з датами

Основні операції зі структурою DateTime пов'язані зі додаванням або відніманням дат. Наприклад коли треба до деякої дати додати, або, навпаки, відняти кілька днів.

Для додавання дат використовується ряд методів:

  • Add(DateTime date): додає дату записану в date
  • AddDays(double value): додає до дати певну кількість днів записаних в аргументі
  • AddHours(double value): додає до дати певну кількість годин записаних в аргументі
  • AddMinutes(double value): додає до дати певну кількість хвилин записаних в аргументі
  • AddMonths(int value): додає до дати певну кількість місяців записаних в аргументі
  • AddYears(int value): додає до дати певну кількість років записаних в аргументі

Наприклад додамо до деякої дати 3 години:

DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25);

// 20.07.2015 18:30:25

Console.WriteLine(date1.AddHours(3));

// 20.07.2015 21:30:25

 

Інші методи можна використовувати таким самим чином.

Для віднімання дат використовується метод Subtract (DateTime date):

DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25);

// 20.07.2015 18:30:25

DateTime date2 = new DateTime(2015, 7, 20, 15, 30, 25);

// 20.07.2015 15:30:25

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

 

Тут дати відрізняються на три години, тому результатом буде дата "3:00:00".

Метод Substract не має можливостей для окремого віднімання днів, годин і так далі. Але це і не треба, так як ми можемо передавати в метод AddDays () і інші методи додавання від'ємні значення:

// віднімемо три години

DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); 

// 20.07.2015 18:30:25

Console.WriteLine(date1.AddHours(-3));

// 20.07.2015 15:30:25

 

Окрім операцій додавання і віднімання ще є ряд методів форматування дат. Дані методи перейдуть від формату дати та часу і запишуть її представлення рядром.

DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25);

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

//Виведе дату згідно поточних налаштувань системи

 

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

//Веведе дату у світовому часі

 

Console.WriteLine(date1.ToLongDateString()); // 20 июля 2015 г.

//Виведе повну дату без значень часу

 

Console.WriteLine(date1.ToShortDateString()); // 20.07.2015

//Запише скорочену дату, без значення часу

 

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

//Вмведе повне значення часу з секундами

 

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

//Виведе час без секунд

 

Примітка: метод ToLocalTime () перетворює час UTC в місцевий час, додаючи зміщення відносно часу за Гринвічем. Метод ToUniversalTime (), навпаки, перетворює локальний час у час UTC, тобто віднімає зміщення відносно часу за Гринвічем. Решта методів перетворять дату до певного формату.

Налаштування формату часу і дати

Не завжди зручно використовувати вбудовані формати дати і часу. Іноді буває необхідно задати свою форму відображення об'єкту DateTime. У цьому випадку ми можемо скласти свій формат з констант-шаблонів:

Шаблон

Опис

d

Представляє день місяця від 1 до 31. однорозрядні числа використовуються без нуля на початку

dd

Представляє день місяця від 1 до 31. До однорозрядних чисел на початку додається нуль

ddd

Скорочена назва дня тижня

dddd

Повна назва дня тижня

f - fffffff

Представляє мілісекунди. Кількість символів f вказує на число розрядів в мілісекундах

g

Представляє період і еру (наприклад, "н. е.")

h

Години у вигляді від 1 до 12. Години з однієї цифри не доповнюються нулем

hh

Години у вигляді від 01 до 12. Години з однією цифрою доповнюються нулем

H

Години у вигляді від 0 до 23. Години з однієї цифри не доповнюються нулем

HH

Години у вигляді від 00 до 23. Години з однієї цифри доповнюються нулем

K

Часовий пояс

m

Хвилини від 0 до 59. Хвилини з однієї цифри не доповнюються нулем з початку

mm

Хвилини від 00 до 59. Хвилини з однієї цифри доповнюються нулем з початку

M

Місяць у вигляді від 1 до 12

MM

Місяць у вигляді від 01 до 12. Місяців з однієї цифри доповнюється нулем з початку

MMM

Скорочена назва місяця

MMMM

Повна назва місяця

s

Секунди у вигляді числа від 0 до 59. секунди з однієї цифри не доповнюються нулем по переду

ss

Секунди у вигляді числа від 0 до 59. секунди з однією цифрою доповнюються нулем по переду

t

Перші символи у позначеннях AM і PM

tt

AM або PM

y

Представляє рік як число з однієї або двох цифр. Якщо рік має більше двох цифр, то в результаті відображаються тільки дві молодші цифри

yy

Представляє рік як число з однієї або двох цифр. Якщо рік має більше двох цифр, то в результаті відображаються тільки дві молодші цифри. Якщо рік має одну цифру, то він доповнюється початковим нулем

yyyy

Рік з чотирьох цифр

z

Представляє зміщення у годинах відносно часу UTC

zz

Представляє зміщення у годинах відносно часу UTC. Якщо зміщення представляє одну цифру, то вона доповнюється нулем з переду

 

Створимо пару своїх форматів:

DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("hh:mm:ss"));

Console.WriteLine(now.ToString("dd.MM.yyyy"));

 

В консолі виведеться:

05:04:43
17.07.2015