тл; д-р
порадити діючі "найкращі практики" навколо Date
таCalendar
це краще , щоб завжди сприяє Calendar
надDate
Не уникайте цих спадкових занять цілком. Замість цього використовуйте класи java.time .
Деталі
Відповіді на цей питання Ortomala Lokni правильно запропонував використовувати сучасні java.time класи , а не настирливих старих класів спадок дати і часу ( Date
,Calendar
і т.д.). Але ця відповідь пропонує неправильний клас як рівнозначний (див. Мій коментар до цього відповіді).
Використання java.time
Класи java.time - це величезне вдосконалення в порівнянні зі застарілими класами дати та часу, різниця в ніч і день. Старі класи погано розроблені, заплутані та клопітні. Ви повинні уникати старих класів, коли це можливо. Але коли вам потрібно перетворити на / зі старого / нового, ви можете це зробити, викликаючи нові методи додати до старих класів.
Більше інформації про конверсію див. У моїй схемі відповідей та вишуканості на інше запитання: Перетворити java.util.Дати тип "java.time"?.
Пошук переповнення стека дає багато сотень прикладів запитань та відповідей щодо використання java.time. Але ось швидкий конспект.
Instant
Отримайте поточний момент за допомогою Instant
. Instant
Клас являє собою момент на шкалі часу в форматі UTC з дозволом наносекунд (до дев'яти (9) цифр десяткового дробу).
Instant instant = Instant.now();
ZonedDateTime
Побачити той самий момент, що пройшов крізь лінзу настінного годинника певного регіону , застосуйте часовий пояс ( ZoneId
), щоб отримати аZonedDateTime
.
Часовий пояс
Вкажіть правильний час ім'я зони в форматі continent/region
, наприклад America/Montreal
, Africa/Casablanca
або Pacific/Auckland
. Ніколи не використовуйте 3-4 лист абревіатури , такі як EST
або , IST
як вони не справжніми часовими поясами, не стандартизованими і навіть не унікальними (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Зсув
Часовий пояс - це історія регіону змін, що відбулися з моменту UTC . Але іноді вам дають лише зміщення без повної зони. У такому випадку використовуйтеOffsetDateTime
клас.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Використання часового поясу краще, ніж використання простого зміщення.
LocalDateTime
"Місцевий" у Local…
класах означає будь-який населений пункт, а не конкретний населений пункт. Тож ім’я може бути контрінтуїтивним.
LocalDateTime
, LocalDate
і LocalTime
навмисно бракує будь-якої інформації про зміщення чи часовий пояс. Таким чином , вони НЕ є реальні моменти, вони НЕ точки на часовій шкалі. Коли ви сумніваєтесь чи сумбурілися, ZonedDateTime
скоріше використовуйтеLocalDateTime
. Шукайте переповнення стека для набагато більшої дискусії.
Струни
Не зв'язуйте об’єкти дати та строки, що представляють їх значення. Ви можете проаналізувати рядок, щоб отримати об'єкт дати та час, а також можна згенерувати рядок із об'єкта дати. Але рядок ніколи не є самою датою-часом.
Дізнайтеся про стандартні формати ISO 8601 , які використовуються за замовчуванням у класах java.time.
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, і SimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі технічного обслуговування , радить перейти на java.time класів .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація є JSR 310 .
Використовуючи драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії, ви можете обміняти java.time об’єктами безпосередньо зі своєю базою даних. Немає потреби в рядках і класах java.sql. *
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .