ТЛ; др
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.
Как правильно отмечено в ответе user3277382 , используйте либо 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 практически идентичен коду Joda-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 Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .