Не уверен, что вопрос был предназначен для java.util.Date
(дата плюс время дня) или a java.sql.Date
(только для даты). В обоих случаях вы должны использовать современные классы java.time, а не трудные классы времени с датой.
Некоторые другие вопросы java.sql.Date
связаны как дубликаты этого. Таким образом, я обрабатываю оба класса (sql util) здесь.
java.util.Date
Наследие java.util.Date
класс представляет собой момент на шкале времени в формате UTC. Это означает дату со временем дня. Хитрость заключается в том, что ваша строка ввода предназначена для значения только для даты. Вы можете сначала проанализировать свою строку как значение только для даты, а затем при необходимости назначить время суток.
Ваша строка ввода соответствует стандарту ISO 8601 формата ГГГГ-ММ-ДД. Классы java.time по умолчанию используют стандартные форматы при разборе/генерации строк. Поэтому нет необходимости указывать шаблон форматирования.
LocalDate ld = LocalDate.parse("2013-05-16") ;
В течение дня вы, вероятно, хотите первый момент дня. Не предполагайте, что первым моментом является 00:00:00
. В некоторых часовых поясах аномалия, такая как переход на летнее время (DST), может привести к тому, что день начнется в другое время, например 01:00:00
. Чтобы объяснить такие аномалии, мы должны указать часовой пояс при определении первого момента дня.
Указать proper time zone name в формате continent/region
, такие как America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, такую как EST
или IST
, так как они не истинные часовые пояса, не стандартизированные, и даже не уникальные (!).
ZoneId z = ZoneId.of("America/Montreal") ;
Применить эту зону в запросе java.time, чтобы определить первый момент дня. В результате мы создаем объект ZonedDateTime
.
ZonedDateTime zdt = ld.atStartOfDay(z) ;
Если вы хотите определенное время суток, нанесите LocalTime
объект. Имейте в виду, что ваше текущее время может быть недействительным в эту конкретную дату для этой конкретной зоны. Например, вы можете указывать время дня, происходящее во время перехода DST. В этом случае класс ZonedDateTime
имеет политику для настройки для размещения. Обязательно прочтите документацию, чтобы понять эту политику и возникающее поведение.
LocalTime lt = LocalTime.of(12 , 0) ;
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z) ; // Time-of-day may be adjusted as needed.
java.sql.Date
Нет необходимости использовать java.sql.Date
. Этот класс заменяется LocalDate
. Класс LocalDate
представляет собой значение даты только без времени и без часового пояса.
JDBC драйвера, которые соответствуют JDBC 4.2 может работать непосредственно с типами java.time по телефону:
Для представления LocalDate
пользователю, сгенерируйте строку для отображения в вашем пользовательском интерфейсе. Используйте автоматическую локализацию DateTimeFormatter
. Чтобы локализовать, укажите:
FormatStyle
, чтобы определить, насколько длинной или сокращенной должна быть строка.
Locale
определить (а) человеческий язык для перевода имени дня, названия месяца и т. Д. И (b) культурные нормы, определяющие вопросы аббревиатуры, капитализации, пунктуации, разделителей и т. Д.
Пример:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(l);
String output = zdt.format(f);
Вы можете пойти в другом направлении, а также, parsing строкой ввода, чтобы получить дату.
LocalDate ld = LocalDate.parse(input , f) ;
Ловушка для исключения, если вход пользователя неисправен или неожиданен.
try{
LocalDate ld = LocalDate.parse(input , f) ;
myPrepStmt.setObject(… , ld) ;
} catch (DateTimeParseException e) {
… // Handle the error condition of faulty/unexpected input by user.
}
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Как вы строите парсер даты? – MadProgrammer
Похоже, что вы можете столкнуться с проблемами со стандартом по умолчанию. Возможно, он использует другой часовой пояс или настройку экономии дневного света, чем вы ожидаете. –