2013-06-21 3 views
0

Я хочу проанализировать дату в YYYY-MM-DD формате до YYYYMMDD. Если я использую следующую функцию, она возвращает мне формат YYYYMMDD, но с другим DD. i.E: 2013-05-16 СТАТЬЯ 20130515Ошибка синтаксического анализа поля даты

Извинения за звучание неграмотных :) Я новичок в Java.

Любая помощь будет оценена по достоинству.

String TestDate=yyyymmddParser.format(oLifEExtension.TestDate().getTime()); 
        sb.append(TestDate) 
+1

Как вы строите парсер даты? – MadProgrammer

+0

Похоже, что вы можете столкнуться с проблемами со стандартом по умолчанию. Возможно, он использует другой часовой пояс или настройку экономии дневного света, чем вы ожидаете. –

ответ

1

SimpleDateFormat должен быть способен достичь того, что вы после этого. Будьте очень осторожны с метками формата, D и d означают разные вещи

String oldDateString = "2013-05-16"; 
System.out.println(oldDateString); 
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(oldDateString); 
System.out.println(date); 
String newDateString = new SimpleDateFormat("yyyyMMdd").format(date); 
System.out.println(newDateString); 

(Кроме того, остерегайтесь Y и y: P)

Это выводит

2013-05-16 
Thu May 16 00:00:00 EST 2013 
20130516 

Для меня ...

0

Не уверен, что вопрос был предназначен для 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?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.