2016-08-24 9 views
-4

Я работаю над приложением Java и у меня есть некоторые проблемы при попытке создать Даты объекта:Почему я получаю эту ошибку, когда пытаюсь создать объект Java.utile.Date из строки?

Так что я сделал:

Calendar dataRendimentoLordoCertificatoCalendar = Calendar.getInstance(); 
dataRendimentoLordoCertificatoCalendar.set(annoCorrente - 1, 10, 01); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
Date dataRendimentoLordoCertifiacato = new Date(sdf.format(dataRendimentoLordoCertificatoCalendar.getTime())); 

Использование отладчика Eclipse, я могу видеть, что значение sdf.format (dataRendimentoLordoCertificatoCalendar.getTime()) (передается в качестве параметра в Дата конструкторе) является 2015-11-01 (и это то, что я ожидаю: первый из Noveember 2015).

Проблема заключается в том, что, когда эта линия выполняется:

Date dataRendimentoLordoCertifiacato = new Date(sdf.format(dataRendimentoLordoCertificatoCalendar.getTime())); 

я получаю это исключение:

Exception in thread "main" java.lang.IllegalArgumentException 
    at java.util.Date.parse(Date.java:598) 
    at java.util.Date.<init>(Date.java:255) 
    at com.mycompany.dbmanager.MyProject.getRendimentoLordoCertificato(PucManager.java:64) 

Почему? Что мне не хватает? Как я могу исправить эту проблему?

Tnx

+8

Что на земле вы пытаетесь сделать? 'dataRendimentoLordoCertificatoCalendar.getTime()' is ** уже ** a 'Date'. Постскриптум с выпуском Java 8, я настоятельно рекомендую вам избегать «Date» и «Calendar», как если бы это было возможно. –

+4

* «Я вижу, что значение sdf.format (dataRendimentoLordoCertificatoCalendar.getTime()) (передано как параметр конструктору Date) равно 2015-11-01« * Нет, это экземпляр ** «Дата» **, содержащий эта дата. Нет смысла превращать это в строку, а затем передать эту строку в конструктор 'Date'. Просто используйте 'Date', который у вас уже есть. –

+1

И если вы не используете Java 8, используйте Joda-Time. Избегайте использования «Календарь» и «Дата». – RealSkeptic

ответ

1

Я не знаю, почему вы хотите это решение, но если вы хотите использовать строки (возвращаемый тип GetTime), вы должны использовать парсер, например:

public static void main(String[] args) throws ParseException { 
    Calendar dataRendimentoLordoCertificatoCalendar = Calendar.getInstance(); 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    Date dataRendimentoLordoCertifiacato = sdf.parse(sdf.format(dataRendimentoLordoCertificatoCalendar.getTime())); 

    System.out.println(dataRendimentoLordoCertifiacato); 
} 

Но я не знаю, что именно ты хочешь. Потому что у вас есть DATE, то вы получаешь Строка этой даты, а затем вы разобрать его обратно даты :-D

0

@Hrabosch прав.

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

LocalDate date = LocalDate.of(2015, Month.JANUARY, 1); 

Если нет, то есть Joda-Time библиотека, которая имеет DateMidnight, так что вы можете сделать:

DateMidnight dateMidnight = new DateMidnight(2015, 1, 1); 
+2

Все «полуночные» классы и методы в Joda-Time устарели. Команда рекомендует заменить их использование вызовом ['withTimeAtStartOfDay'] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay--). Кроме того, Joda-Time имеет класс ['LocalDate'] (http://www.joda.org/joda-time/apidocs/org/joda/time/LocalDate.html). –

+0

Большая часть функциональности java.time портирована на Java 6 и 7 в [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) и далее адаптирована к [Android] (https: // en .wikipedia.org/wiki/Android_ (operating_system)) в [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP) (см. [* Как использовать ... *] (http://stackoverflow.com/q/38922754/642706)). –