Маленькі чудеса c #

Продовжую переводити "Маленькі чудеса.". Після успішної трилогії - серіал. Оригінал статті.

Ще раз дозвольте зануритися в "Маленькі чудеса .NET" - ці маленькі "штучки" в мовах платформи .NET і класах BCL, які роблять розробку простіше за рахунок підвищення Новомосковскемості коду, сопровождаемости або продуктивності.

Сьогодні я збираюся зосередитися на System.DateTime. Ця невелика структура була в BCL з самого початку, вона широко використовується для подання примірників дати і часу. У ній є багато чудових властивостей, методів і операторів, які, можливо, не настільки широко відомі, але можуть дати вам безліч переваг.

Маленьке зауваження про конструктора за замовчуванням

Одна з перших особливостей, яку помічають при переході c Java на C # є те, що конструктор за замовчуванням для DateTime повертатися не поточний час, а мінімальне.

Чому це відбувається? Чому б не повертати поточну дату і час? Ключовим моментом тут є те, що DateTime є структурою. Структура була обрана з міркувань продуктивності, щоб зробити екземпляри DateTime дуже легковажно, але одним з численних наслідків цього є те, що ви не можете визначити поведінку структури в конструкторі за замовчуванням. Конструктор за замовчуванням структури завжди инициализирует все поля поточними значеннями (нуль для числових типів, null для посилальних типів, і т.д.).

Оскільки поточними значеннями всіх полів структури є їх значення за замовчуванням, тому що використовується при створенні DateTime конструктор за замовчуванням дає вам випадок, коли значення dateData дорівнює нулю. Це означає, що кількість тактів (молодші 62 біта) дорівнюють нулю, і тип (старші 2 біта) також дорівнює нулю. Це нульовий зсув від мінімального значення DateTime і тип Unspecified.

Поточний час, але яке?

Якщо ви хочете отримати поточні місцеві час і дату, найпростіший спосіб полягає у використанні статичного поля DateTime.Now.

Це широко використовується для отримання місцевих часу і дати, але якщо ми працюємо в кількох часових поясах, ми можемо захотіти використовувати час UTC, щоб мати незалежність від розміщення. У цьому випадку ми повинні викликати:

DateTime.UtcNow повертає поточну дату і час, але замість використання локального часового поясу, воно представляє їх як час UTC. Важливо, яке з властивостей ви будете використовувати, тому що воно встановить два старших біти в dateData, які визначають тип DateTime. Ми можемо легко запросити ці два страших біта за допомогою властивості Kind:

Конструктори з DateTimeKind

Використовуючи Now або UtcNow, ми можемо встановити страшний біти dateData відповідним чином, але що, якщо ви хочете самі визначити дату і час (скажімо, для подання певних свят або ключових календарних подій)? Багато конструктори перевантажені так, щоб забезпечити додатковий параметр DateTimeKind:

Слід зазначити, що конструктор, який приймає тільки рік, місяць і день не має параметра DateTimeKind. Якщо ви хочете визначити екземпляр DateTime, що містить тільки дату (без значення часу) в контексті UTC або місцевого часу, то краще вказати це явно:

Коли вам потрібна дата або час, але не те й інше разом

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

Немає необхідності вручну конструювати нові екземпляри DateTime:

По-перше, є статична властивість Today, яке дає нам DateTime на поточну дату опівночі за місцевим часом. Або, якщо у вас є екземпляр DateTime, і ви хочете отримати тільки компонент дати або часу, ви можете використовувати властивість Date або TimeOfDay відповідно.

Властивість Date повертає новий екземпляр, що містить початкову дату на момент півночі (нуль годин, хвилин і секунд), властивість TimeOfDay повертає екземпляр TimeSpan, що містить час оригінального примірника (ви можете уявити його, як зсув від півночі оригінального примірника).

Операції з DateTime

Більшість з вас знають, що ми можемо порівнювати екземпляри DateTime за допомогою традиційних операторів порівняння (<, <=,>,> =, ==. =) Або за допомогою методу CompareTo (). Але ми також можемо додавати і віднімати екземпляри DateTime.

Майте на увазі, що DateTime є незмінним, що означає, що кожен раз при операціях з DateTime створюється новий екземпляр. Але так як DateTime - це структура з одним полем, то пов'язані з цим витрати вкрай малі, і ви не повинні враховувати цей фактор.

Додавання примірника TimeSpan до DateTime можливо за допомогою методу Add () і оператора +. TimeSpan може бути позитивним або негативним (додавання негативного TimeSpan еквівалентно віднімання позитивного TimeSpan, і навпаки).

Якщо вам не потрібен TimeSpan повністю і ви просто хочете додати (або відняти) окремі компоненти, ви можете використовувати допоміжні методи Add. () Для днів, годин, років і т.д.

Зауважимо, що методи Add. () Є спорідненими методам Substract. (). У разі методів Add. (), Якщо вам потрібно вичитати дні, години, місяці і т.д. потрібно просто додати від'ємне значення.

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