ТЛ; др
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 8601YYYY-MM-DD
. Или используйте LocalDate
объект из Joda-Time (см. Ниже).
Joda времени
Первое, чему нужно научиться на 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
). Затем, используя шаблон « Неизменяемые объекты» , мы создаем новое время-дату, основанное на том же мгновении старого объекта (количество наносекунд с начала эпохи ), но назначенном другом часовом поясе. Наконец, мы получаем a, у 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
, и более .