Преобразование строк в дату mm / dd / yy до YYYY-MM-DD в java
Я хочу преобразовать значения String в формате mm / dd / yy в дату YYYY-MM-DD. как это сделать?
Входной параметр: 03/01/18
Код для преобразования String в Date приведен ниже
- Как получить текущее местоположение в Android
- Простой экспорт и импорт базы данных SQLite на Android
- Не удалось запустить sdkmanager --list (Android SDK) с Java 9
- Речь в текст на Android
- getHeight возвращает 0 для всех объектов Android UI
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"
- Как просмотреть файл Realm в браузере Realm?
- Selenium - базовая аутентификация через URL-адрес
- Библиотека PDF для рендеринга файлов PDF в Android
- Каковы все различные способы создания объекта в Java?
- шифрование / дешифрование в Android с помощью AES
- Может ли основной метод в Java возвращать что-то?
- Множество TypeFace в одиночном TextView
- Загрузить профиль Chrome с помощью Selenium WebDriver с помощью java
Как вы говорите, ввод находится в другом формате, сначала преобразуйте 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; }
Решение этой проблемы
- Преобразуйте значение даты строки в формате «dd / mm / yy» в Date.
- Используя преобразованную дату, можно создать необходимый формат даты.
Метод приведен ниже
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
.