разобрать строку в формат даты

Я импортирую данные из файла csv через opencsv для вставки в базу данных mysql. opencsv импортирует как строку, и для 1 поля в БД мне нужно проанализировать его на сегодняшний день в формате: гггг-ММ-дд. Однако я получаю сообщение об ошибке.

// This is the string that I have extracted from the csv file           
String elem1 = nextLine[0];

// printing out to console I can see the string I wish to convert
System.out.println(elem1); => 2015-08-14

// Below is my code to parse the date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date convertedCurrentDate = sdf.parse(elem1);
String date=sdf.format(convertedCurrentDate );

// printing date to console gives me 2015-08-14
System.out.println(date);

Как упоминалось выше, дата печати на консоли дает мне 2015-08-14. Однако я получаю сообщение об ошибке:

java.text.ParseException: Unparseable date: "" 

Может ли кто-нибудь дать мне несколько советов относительно того, что я делаю неправильно?

Строка 'java.util.Date convertCurrentDate = sdf.parse(elem1);' это строка, вызывающая ошибку.

Спасибо!


person user1523236    schedule 21.08.2015    source источник
comment
Можете ли вы указать, какая строка вызывает ошибку? Это: java.util.Date convertCurrentDate = sdf.parse(elem1); Спасибо   -  person Stack Player    schedule 21.08.2015
comment
Привет, игрок стека. Да, это линия. Я отредактировал исходный вопрос, чтобы включить эту деталь.   -  person user1523236    schedule 21.08.2015
comment
Тогда elem1 в этот момент, очевидно, является пустой строкой (очевидно, потому что об этом говорится в сообщении об ошибке).   -  person Andreas    schedule 21.08.2015
comment
Какую версию Java вы используете? Я знаю, что это, вероятно, не проблема, но в документах Java7 я не вижу синтаксический анализ (строка), а только синтаксический анализ (строка, Parseposition)? docs.oracle.com/javase/7/docs/api/java/text/ (редактирование и Java6 и 8)   -  person Kevvvvyp    schedule 21.08.2015
comment
Привет, Андреас, хорошо, но я напечатал значение elem1 перед кодом синтаксического анализа, и оно правильное. Также я печатаю переменную даты после кода синтаксического анализа, и она также дает мне дату. Поэтому я не понимаю, как это пустая строка.   -  person user1523236    schedule 21.08.2015
comment
@kevinPaton - Обновление версии 8 45.   -  person user1523236    schedule 21.08.2015
comment
Странно, запускал код, у меня работает нормально. (Интересно, почему в документах нет .parse(String)? Может быть, я идиот и пропустил это.)   -  person Kevvvvyp    schedule 21.08.2015
comment
Попробуйте установить локаль? stackoverflow.com/questions/781257/   -  person Kevvvvyp    schedule 21.08.2015
comment
Если бы sdf.parse() выдал исключение, остальные операторы не выполнялись бы. Итак, я не думаю, что ваши sdf.format() и sysout(date) дадут результат. Вы уверены в строке трассировки стека?   -  person Ravi K Thapliyal    schedule 21.08.2015
comment
Я думаю, что это как-то связано с тем, что он был извлечен из файла csv. Я создал новую переменную String elem2 = 2015-08-16; и обновил мой код для разбора elem2, и это сработало. Почему он не разбирает elem1 очень странно.   -  person user1523236    schedule 21.08.2015
comment
@KevinPaton Нет, локаль здесь не проблема, так как в ожидаемом вводе нет текста, названий месяцев или названий дней недели. Только с цифрами и заданным шаблоном синтаксического анализа Locale не имеет значения. При использовании шаблона локализованного синтаксического анализа с программным кодом значение Locale будет иметь значение. Но это не тот случай.   -  person Basil Bourque    schedule 22.08.2015
comment
@BasilBourque, спасибо   -  person Kevvvvyp    schedule 22.08.2015


Ответы (2)


Я в тупике, также на моей машине проходит следующий тест

public class DateFormatterTest {

private static final String TEST_DATE = "2015-08-14";

   @Test
   public void SimpleDateFormatTest() throws ParseException {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      java.util.Date convertedCurrentDate = sdf.parse(TEST_DATE);
      String date=sdf.format(convertedCurrentDate );
      assertEquals(TEST_DATE, date);
   } 

}

Какую версию Java вы используете? Я знаю, что в последней версии java 8 (8u61) и JodaTime была проблема.

Также попробуйте приведенный выше тест, который исключает все, кроме кода даты.

person Scott Conway    schedule 22.08.2015

Вот простой пример для этого:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
String dateInString = "7-Jun-2013";
try {
    Date date = formatter.parse(dateInString);
    System.out.println(date);
    System.out.println(formatter.format(date));
} catch (ParseException e) {
    e.printStackTrace();
}

Обновление Java 8

String string = "August 21, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2015-09-21

Я думаю, это то, что вы хотите. Рад помочь, спасибо

person Anand Dwivedi    schedule 21.08.2015
comment
Эй Ананд - Спасибо за ваш ответ. Я попробовал ваше предложение, но получил ошибку: текст «2015-08-14» не может быть проанализирован с индексом 0. Формат даты в файле csv — гггг-мм-дд. поэтому я обновил приведенный выше код следующим образом: DateTimeFormatter formatter = DateTimeFormatter.ofPattern(yyyy MM, dd, Locale.ENGLISH); но это дало мне ошибку: текст «2015-08-14» не может быть проанализирован по индексу 4. - Есть идеи? - person user1523236; 21.08.2015
comment
Сначала вы проверяете системный формат даты, а затем тот же формат, который вы предоставляете в коде. - person Anand Dwivedi; 21.08.2015
comment
Я полагаю, вы имеете в виду формат даты на моем Mac? Проверил, формат тот же - 2015-08-21. Время указано в 24-часовом формате. Не уверен, что это имеет значение. - person user1523236; 21.08.2015
comment
Поскольку ваш Mac отображается как 2015-08-21, а вы проходите как 21 августа 2015 г. или 7 июня 2013 г., это может создать проблему. - person Anand Dwivedi; 21.08.2015
comment
Нет, прохожу в формате - 2015-08-14. Укажите это в исходном вопросе. Система.out.println(elem1); =› 2015-08-14 - Итак, да. Я довольно тупик на этом этапе. :-( - person user1523236; 21.08.2015