тл; д-р
порадити діючі "найкращі практики" навколо 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, і більш .