Преобразование строк в дату mm / dd / yy до YYYY-MM-DD в java

Я хочу преобразовать значения String в формате mm / dd / yy в дату YYYY-MM-DD. как это сделать?

Входной параметр: 03/01/18

Код для преобразования String в Date приведен ниже

public static Date stringToDateLinen(String dateVlaue) { Date date = null; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); try { date = formatter.parse(dateVlaue); } catch (ParseException e) { e.printStackTrace(); } return date; } 

При попытке конвертировать с использованием этого метода отображается следующая ошибка

 java.text.ParseException: Unparseable date: "03/01/18" 

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

Чтобы преобразовать в качестве даты,

 SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yy"); date = formatter.parse(dateVlaue); 

Чтобы распечатать его в другом формате,

 SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd"); dateString = formatter1.format(date) 

Вы пишете это неправильно. Фактически, для даты, которую вы хотите преобразовать, вам нужно написать SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yy");

Формат, который вы передаете SimpleDateFormat («yyyy-MM-dd»), который ожидает, что дата будет в форме 2013-03-01 и, следовательно, ошибка.

Вам нужно указать правильный формат, который вы передаете, как показано ниже.

 public static Date stringToDateLinen(String dateVlaue) { Date date = null; SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy"); try { date = formatter.parse(dateVlaue); } catch (ParseException e) { e.printStackTrace(); } return date; } 

Решение этой проблемы

  1. Преобразуйте значение даты строки в формате «dd / mm / yy» в Date.
  2. Используя преобразованную дату, можно создать необходимый формат даты.

Метод приведен ниже

 public static String stringToDateLinen(String dateVlaue) { Date date = null; SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yy"); String dateString = null; try { // convert to Date Format From "dd/mm/yy" to Date date = formatter.parse(dateVlaue); // from the Converted date to the required format eg : "yyyy-MM-dd" SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd"); dateString = formatter1.format(date); } catch (ParseException e) { e.printStackTrace(); } return dateString; } 

EDIT: ваш вопрос сказал «String values ​​в формате mm / dd / yy», но я понимаю из ваших комментариев, что вы имели в виду «мой формат ввода – dd / mm / yy как строка», поэтому я изменил строку шаблона формата в нижнем коде соответственно. В противном случае код будет одинаковым в обоих случаях.

 public static Optional stringToDateLinen(String dateValue) { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yy"); try { return Optional.of(LocalDate.parse(dateValue, dateFormatter)); } catch (DateTimeParseException dtpe) { return Optional.empty(); } } 

Попробуй:

  stringToDateLinen("03/01/18") .ifPresentOrElse(System.out::println, () -> System.out.println("Could not parse")); 

Вывод:

2018-01-03

Я рекомендую вам держаться подальше от SimpleDateFormat . Он давно устарел и, как известно, хлопотно. И Date так же устарела. Вместо этого используйте LocalDate и DateTimeFormatter из java.time , современного API дат и времени Java. С этим гораздо приятнее работать. LocalDate – это дата без времени суток, так что это соответствует вашим требованиям намного лучше, чем Date , которая, несмотря на свое имя, является моментом времени. LocalDate.toString() производит именно тот формат, который, как вы сказали, вам LocalDate (хотя у LocalDate нет формата).

Мой метод интерпретирует ваш 2-значный год в 2000 году, то есть с 2000 по 2099 год. Пожалуйста, подумайте дважды, прежде чем решите, что это то, что вы хотите.

Что бы вы хотели, если строка не может быть проанализирована в действительную дату? Я боюсь, что возrotation null является ожидающим NullPointerException и последующим отладочным сеансом для отслеживания основной причины. Вы можете подумать о том, чтобы исключить исключение DateTimeParseException из вашего метода (просто объявите это в Javadoc), поэтому основная причина находится в трассировке стека. Или даже выбросить AssertionError если ситуация не должна произойти. В моем коде я возвращаю Optional , который явно сигнализирует вызывающему, что не может быть результата, который (я надеюсь) предотвращает любое NullPointerException . В коде, вызывающем метод, я использую метод ifPresentOrElse представленный в Java 9. Если вы еще не используете Java 9, используйте ifPresent и / или читайте больше об использовании ifPresent другом месте.

Что пошло не так в коде?

Другие ответы правильны: ваша строка шаблона формата, используемая для синтаксического анализа, должна соответствовать вводу (а не вашему выводу). ParseException было ParseException потому, что в шаблоне формата были дефисы и косые черты ввода. Хорошо, что вы получили исключение, потому что другая проблема заключается в том, что порядок года, месяца и дня не соответствует, а также количество цифр в году.

Ссылка

  • Учебник Oracle: Дата Время, объясняющее, как использовать java.time .
  • java, расширяющий class с конструктором основного classа имеет параметр
  • Android - доступ к файлу из активов \ PDF-дисплей
  • Android FTP Library
  • Завершение программы Java
  • Разница между getClass (). GetClassLoader (). GetResource () и getClass.getResource ()?
  • Android Studio TransformException: ошибка: выполнение не выполнено для задачи ': app: transformClassesWithDexForDebug'
  • Почему окончательная переменная должна быть инициализирована до завершения конструктора?
  • Создание приложения Android Lock Screen.
  • Ошибка CreateProcess = 740. Запрошенная операция требует повышения
  • Pixel-Perfect Collision Detection Android
  • НЕОПРЕДЕЛЕННОЕ ТОП-УРОВЕННОЕ ИСКЛЮЧЕНИЕ: com.android.dex.DexException: несколько файлов dex определяют
  • Давайте будем гением компьютера.