Другие ответы верны, но устарели.
java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
. Команда Joda-Time также рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.
Большая часть функциональности java.time портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.
LocalDate
A LocalDate
представляет собой дату только значение без времени суток и без временной зоны.
Ваша входная строка соответствует стандарту ISO 8601, поэтому ее можно разобрать непосредственно на LocalDate
. Нет необходимости указывать шаблон форматирования.
String input = "2014-10-01";
LocalDate localDate = LocalDate.parse(input);
ZonedDateTime
Вы предполагаете день начинается во время 00:00:00
. Но это не всегда случай. В некоторых часовых поясах летнее время (DST) или, возможно, другие аномалии могут означать, что день начинается в другое время на часах, таких как 01:00:00
. Пусть java.time определяет время начала первого момента дня. Укажите часовой пояс, и при условии, что tz database в комплекте с Java обновлен, тогда звонок LocalDate::atStartOfDay
создает ZonedDateTime
для вашей даты и первого момента.
ZoneId zoneId = ZoneId.of("America/Los_Angeles");
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
Если вы хотите первый момент дня в UTC указать константу ZoneOffset.UTC
(ZoneOffset
быть подклассом ZoneId
).
ZonedDateTime zdt = localDate.atStartOfDay(ZoneOffset.UTC);
В качестве альтернативы используйте более подходящий класс OffsetDateTime
. Это значение для значений с offset-from-UTC, но не имеет набора правил для обработки аномалий, таких как DST, найденных в полном размере time zone. В UTC день всегда начинается с 00:00:00
, который хранится в константе LocalTime.MIN
.
OffsetTime ot = OffsetTime.of(LocalTime.MIN , ZoneOffset.UTC);
OffsetDateTime odt = localDate.atTime(offsetTime);
Database
Для работы с базами данных, если вы хотите даты только значения, хранящегося вам следует использовать тип данных вдоль линий SQL Standard type of DATE
.
Для значения даты и времени почти каждая серьезная база данных преобразует входящие данные в UTC для хранения в столбце типа TIMESTAMP WITH TIME ZONE
. Драйвер JDBC должен помочь с этим. Но тест и эксперимент, так как поведение драйверов и баз данных колеблется чрезвычайно.
С JDBC 4.2 и более поздними версиями вы можете передавать/извлекать типы java.time напрямую через setObject
/getObject
. Если нет, перейдите в типы java.sql с помощью новых методов, добавленных в старые классы.
Я всегда использую библиотеки joda для всех связанных по дате полей. Преобразование между часовыми поясами является простым, и я считаю, что потокобезопасность. Кроме того, joda formatters (в отличие от родной java DateFormatter) - это потокобезопасный – Josh
Итак, босс позволяет добавлять Spring, но не Joda-Time? Вам нужно объяснить боссу, насколько очень плохи связанные классы времени и времени, и вам очень нужно Joda-Time. Joda-Time широко используется, стабильна и износостойка. Новый пакет java.time в комплекте с Java 8 тоже хорош, вдохновленный Joda-Time, но переработанный. У Joda-Time и java.time есть свои преимущества. Я использую оба. –