Лекція 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