Конвертировать дату 6 месяцев назад с этого момента в строку - PullRequest
0 голосов
/ 04 февраля 2019

Я взял все ответы, данные на SOF и других веб-сайтах, и попытался сделать это:

String fromDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssX").format(new DateTime().plusMonths(-6));

Но мне дают исключение:

Исключение в теме"main" java.lang.IllegalArgumentException: невозможно отформатировать данный объект как дату

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

java.time

    String fromDateTime = OffsetDateTime.now(ZoneId.systemDefault()).minusMonths(6).toString();
    System.out.println(fromDateTime);

Вывод при запуске на моем компьютере только сейчас:

2018-08-04T12: 45: 34.087966 + 01: 00

java.time - это современный Java-интерфейс даты и времени, который эффективно заменил Joda-Time.С домашней страницы:

Обратите внимание, что Joda-Time считается в значительной степени «законченным» проектом.Никаких серьезных улучшений не планируется.При использовании Java SE 8, пожалуйста, перейдите на java.time (JSR-310).

В коде я использую тот факт, что методы toString классов java.time производят ISO8601 формат, формат, который вы просили.Я считаю маловероятным, что дополнительные десятичные числа в секундах будут представлять какую-либо проблему, поскольку они разрешены в стандарте.

Joda-Time

    String fromDateTime = new DateTime().minusMonths(6).toString();

Пример вывода:

2018-08-04T12: 50: 36.071 + 02: 00

new DateTime() только с точностью до миллисекунды.Вы всегда будете получать ровно 3 десятичных знака в секундах.

Я должен использовать старые библиотеки Java, потому что я работаю в компании, которая использует версию Java <8 </h2> java.time прекрасно работает на Java 6и 7 тоже, и при прочих равных, я рекомендую это по Joda-Time.Joda-Time, без сомнения, является хорошим выбором, если принудительно использовать Java 5. В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) java.time поставляется встроенным. В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу). На (более старых) Android используетсяAndroid-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами. Что пошло не так в вашем коде?

Ваш код может быть скомпилирован без признаков ошибок, новыдает java.lang.IllegalArgumentException: Cannot format given Object as a Date при запуске.Это связано с тем, что SimpleDateFormat не может отформатировать объект Joda-Time DateTime.Конечно, мы ожидали, что об этом будет сообщено во время компиляции.Но в дополнение к SimpleDateFormat.format(Date) есть также переопределенный format(Object), унаследованный от Format.Он работает для форматирования Date или Number (за миллисекунды с начала эпохи).Этот метод тот, который компилятор выбирает, когда вы передаете DateTime.Вот почему нет сообщения об ошибке во время компиляции.

Совет: Если вы не сразу понимаете сообщение об ошибке, вставьте его в свою поисковую систему.Это очень часто приведет вас к объяснению и решению.Также в этом случае.

Ссылки

0 голосов
/ 04 февраля 2019

Попробуйте выполнить следующее:

String fromDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sssX").format(new DateTime().minusMonths(6).toDate());

Вам необходимо преобразовать DateTime в Date перед форматированием, используя метод toDate(), чтобы выполнить работу.

API для toDate() и API для minusMonths, я бы порекомендовал вам проверить API для новых методов

...