2013-09-13 1 views
0

Я работаю с строками даты, которые необходимо преобразовать в объекты java.util.date.Преобразование строки в java.util.date

Я использую следующий код, чтобы сделать это:

public void setDates(String from, String to) throws ParseException 
{ 
    Date fromDate = new Date(); 
    Date toDate = new Date(); 
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 

    fromDate = df.parse(from); 
    toDate = df.parse(to); 

    this.setDepartDate(fromDate); 
    this.setReturnDate(toDate); 
} 

Проблема заключается в том, что строковые значения, которые я должен преобразовать всегда (и у меня нет контроля над этим) в следующем формате: «20 сентября 2013 года».

Это вызывает мою функцию через ParseException, когда он достигает fromDate = df.parse(from);

Может кто-нибудь помочь мне понять, почему, и, возможно, предложить решение?

+0

так, чтобы набор SimpleDateFormat в формате ожидается –

ответ

6

Отъезд SimpleDateFormat JavaDocs для доступных вариантов форматирования, но в основном, вы должны изменить формат даты на что-то больше похоже на dd MMMM, yyyy

try { 
    String dateValue = "20 September, 2013"; 
    SimpleDateFormat df = new SimpleDateFormat("dd MMMM, yyyy"); 
    Date date = df.parse(dateValue); 
    System.out.println(date); 
} catch (ParseException exp) { 
    exp.printStackTrace(); 
} 

который выводит ...

Fri Sep 20 00:00:00 EST 2013 
+0

DD для «день в году» - думаю, что не будет работать –

+0

@GyroGearless Да, поймал его: P – MadProgrammer

+0

@MadProgrammer Спасибо! У меня создалось впечатление, что формат, который вы предоставили объекту SimpleDateFormat, был форматом, в котором вы хотели указать дату, после его разбора, а не с той строкой, которую вы давали. – Skytiger

5

Вы написали

[...] в следующем формате: «20 сентября 2013 года».

Тогда ваш SimpleDateFormat должен быть

"dd MMM, yyyy" 

Вы можете проверить SimpleDateFormat documentation.

6

В соответствии с javadoc использования следующего форматом

SimpleDateFormat df = new SimpleDateFormat("dd MMMMM, yyyy"); 

также решить, если это синтаксический анализ должен быть Lenient или нет, и если это необходимо, чтобы быть строгими Используйте setLenient(false)

По умолчанию разбора снисходителен : Если вход не находится в форме, используемой способом этого объекта, но все же может быть проанализирован как дата, то анализ будет успешным. Клиенты могут настаивать на строгом соблюдении формата , вызвав setLenient (false).

Также обратите внимание, что SimpleDateFormat не является потоковым. Если есть выбор, я рекомендую использовать Joda Time Library, которые обеспечивают значительно расширенную функциональность.

4

Когда вы разбираете дату, вам нужно знать какой-то контекст или использовать некоторые предположения. Вы можете использовать SimpleDateFormat, но вам может понадобиться предварительно разобрать строку, чтобы увидеть, какой формат она есть, прежде чем вы ее используете. Возможно, вам придется попробовать несколько форматов, чтобы увидеть, есть ли один или несколько способов анализа даты.

BTW - 01/02/30 1 февраля 1930 года или 2 января 2030 года или 30 февраля 2001 года, вам нужно знать что-то о том, какая дата может означать или иметь некоторый контроль над форматом.