тл; д-р
LocalDate.of( 1985 , 1 , 1 )
… Або…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Деталі
В java.util.Date
, java.util.Calendar
і java.text.SimpleDateFormat
класи були доставлені занадто швидко , коли Java першого запуску і еволюціонував. Заняття не були добре розроблені або впроваджені. Були зроблені спроби вдосконалення, таким чином, ви знайшли депресію. На жаль, спроби вдосконалення значною мірою провалилися. Вам слід взагалі уникати цих занять . Вони витіснені в Java 8 новими класами.
Проблеми у вашому коді
У java.util.Date є і дата, і час. Ви проігнорували проміжок часу у своєму коді. Таким чином, клас Date займе початок дня, як визначено часовим поясом за замовчуванням у вашому JVM, і застосує цей час до об'єкта Date. Таким чином, результати вашого коду залежать від того, на якій машині він працює або який часовий пояс встановлений. Напевно, не те, що ти хочеш.
Якщо ви хочете просто дати, без частини часу, наприклад, дати народження, можливо, ви не захочете використовувати Date
об'єкт. Ви можете зберегти лише рядок дати, в ISO 8601 форматіYYYY-MM-DD
. Або використовувати LocalDate
об’єкт Joda-Time (див. Нижче).
Joda-Time
Перше, що потрібно вивчити на Java: уникайте горезвісних клопотів java.util.Date & java.util.Calendar, в комплекті з Java.
Як правильно зазначено у відповіді від користувача3277382 , використовуйте або Joda-Time або новий пакет java.time. * На Java 8.
Приклад коду в Joda-Time 2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Дамп до консолі ...
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Під час запуску…
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
java.time
У цьому випадку код для java.time майже ідентичний коду -Time .
Ми отримуємо часовий пояс ( ZoneId
) і будуємо об'єкт дати-часу, призначений цьому часовому поясу ( ZonedDateTime
). Тоді, використовуючи шаблон Immutable Objects , ми створюємо нові дати-дати на основі того самого моменту старого об'єкта (кількість наносекунд з епохи ), але присвоюємо інший часовий пояс. Нарешті, ми отримуємо число, LocalDate
яке не має ні часу, ні часового поясу, хоча зауважте, що часовий пояс застосовується при визначенні цієї дати (новий день світається раніше в Осло, ніж в Нью-Йорку, наприклад).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, іSimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*
заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .