Java 8 дата і час

Обробка дат і часу досить складне завдання. У світі існує велика кількість часових поясів, які періодично змінюються. Потрібно враховувати перехід на зимовий і літній час, секунди координації. високосні роки і багато іншого.

Java вже досить багато років, і спроб створити класи для обробки дат було кілька. Тут я лише в загальних рисах опишу три способи:

    • java.util.Date - найдавніший спосіб. Велика частина методів відзначена застарілими, але сам клас досі використовується досить часто.
    • java.util.Calendar - зазвичай використовується спільно з java. util. Date.
    • Пакет java.time - новий спосіб, сильно перевершує попередні по зручності і функціоналу, але використовується поки не так часто (принаймні мені рідко доводилося стикатися.

java.util.Date

Найдавніший спосіб. Якщо ви подивіться на опис методів java.util.Date. то ви помітите, що велика частина методів вказана застарілими. Реально корисного і працює всього чуть-чуть.

Повертає часовий пояс, асоційований з даним екземпляром Calendar.

Найбільш зручний і сучасний спосіб роботи з датою і часом. Бере свій початок від бібліотеки Joda-Time.

Є два базових способу представлення часу. Один спосіб представляє час в термінах людини, таких як рік, місяць, день, годину, хвилини і секунди. Другий спосіб являє машинний час, вимірюючи час безперервно з початку, званого епохою, в наносекундах. Пакет Date-Time містить велику кількість класів, що представляє дату і час. Деякі класи в Date-Time API представляють машинний час, деякі людське.

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

Наприклад, ви можете вибрати java. time. LocalDate для зберігання дати народження, так як багато людей святкують день народження в той же день, незалежно від того, чи знаходяться вони в місці народження або на іншому кінці Землі. Якщо вам потрібно астрологічне час, то ви можете використовувати java. time. LocalDateTime. щоб показати дату і день народження, або java. time. ZonedDateTime. який додатково містить часовий пояс. Якщо ви створюєте тимчасову позначку, то найімовірніше ви захочете використовувати java. time. Instant. який дозволяє порівнювати одну тимчасову позначку з іншого.

Сумарна таблиця класів пакета java. time:

Клас або перерахування

* Секунди зважають на точністю до наносекунд
** Цей клас не зберігаються цю інформацію, але має методи для отримання часу в них.
*** Коли Period додається до ZonedDateTime. то враховується перехід на зимовий / літній час і відміну локального часу.

java.time.DayOfWeek

Перерахування java.time.DayOfWeek складається з семи констант, що описують дні тижня. Цілочисельні значення для констант починаються з 1 (понеділок) і закінчуються 7 (неділя).

MONDAY (понеділок, 1)
TUESDAY (вівторок, 2)
WEDNESDAY (середа, 3)
THURSDAY (четвер, 4)
FRIDAY (п'ятниця, 5)
SATURDAY (субота, 6)
SUNDAY (неділя, 7)

Ви можете використовувати метод public String getDisplayName (TextStyle style. Locale locale) для отримання назв днів тижня відповідно до регіональних настройками користувача. Перерахування java. time. format. TextStyle дозволяє вказати тип рядка: FULL. NARROW (зазвичай одна буква), SHORT (абревіатура).

Класи java. time. ZonedDateTime і java. time. OffsetDateTime можуть бути перетворені в екземпляр java. time. Instant. так як вони вказують на конкретний момент у часі. Однак для зворотного перетворення потрібно вказати часовий пояс або зміщення.

Форматування і перетворення з рядка

Тимчасові класи з Date-Time API містить методи parse і format для розбору дати і / або часу з рядка і форматованого виведення в рядок. Ці методи приймають екземпляр класу java.time.format.DateTimeFormatter. Клас DateTimeFormatter містить велику кількість зумовлених форматіровщіков, ви також можете визначити свій.

Методи parse і format кидають виняток, якщо під час конвертації виникає якась проблема. Ваш код розбору рядка повинен відловлювати виняток java.time.format.DateTimeParseException. а форматує код повинен відловлювати java.time.format.DateTimeException Ці виключення непроверяемие, так що компілятор не вимагатиме їх обов'язкової обробки.

Клас java. time. format. DateTimeFormatter незмінний і потокобезпечна. Його можна привласнити константі, якщо потрібно.

Класи з java. time можна використовувати і в java. util. Formatter і в String. format. як і старі класи java. util. Date і java. util. Calendar.

java.time.temporal.TemporalAdjuster

Інтерфейс java.time.temporal.TemporalAdjuster містить методи, які приймають значення часу і повертає його вирівняне по якомусь принципом значення.

Клас java.time.temporal.TemporalAdjusters містить зумовлені Вирівнювачі дати і часу для пошуку першого або останнього дня в місяці, першого або останнього дня року, останньої середи місяця і т. Д.

Ці обчислення не враховують різницю в часових поясах. Наприклад, якщо ви народилися в Австралії, а зараз живете в Бангалорі, то це може трохи вплинути на обчислення вашого віку. У подібних ситуаціях використовуйте Period разом з ZonedDateTime.

java.time.Clock

Багато класів з датою і часом містять метод now (). який створює об'єкт з поточною датою і часом, використовуючи системний годинник і часовий пояс за умовчанням. Ці ж об'єкти також містять метод now (Clock). який дозволяє передати другій java. time. Clock.

Поточна дата і час залежать від часового поясу і для глобальних програм необхідний З lock. щоб гарантувати створення дати / часу з коректним часового поясу. Незважаючи на те що використання java. time. Clock необов'язково, але ця можливість допомагає тестувати ваш код з іншими часовими зонами або з фіксованим часом.

Клас Clock абстрактний, тому ви не можете створити його примірників. Наступні фабричні методи можуть бути корисні для тестування:

  • Clock.offset (Clock, Duration) повертає clock, який є зміщенням на вказаний Duration.
  • Clock.systemUTC () повертає clock, що містить часовий пояс Грінвіч / UTC.
  • Clock.fixed (Instant, ZoneId) завжди повертає один і той же Instant. Для цього Clock час не йде, воно зупинилося.

Ще записи з цієї рубрики:

Схожі статті