Изменение формата даты строки

мой текущий формат даты: 08/11/2008 00:00

Мне нужно преобразовать этот вывод в 2008/11/08 00:00 Однако, используя SimpleDateFormat, как было исследовано, он не может этого сделать и дать мне совершенно другой результат, вот мои коды, как:

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm") Date starting= simpleDateFormat2.parse(startTime); System.out.println("" + simpleDateFormat2.format(starting) + " real date " + startTime); 

Я знаю, что я разбираюсь в правильной строке, учитывая, что происходит следующий вывод:

 0014/05/01 00:00 real date 08/11/2008 00:00 

я не слишком уверен в том, как обнаружена механика 0014/05/01 00:00 вместо

2008/11/08 00:00

Я с нетерпением жду всех предложений. Спасибо заранее

Первое, что вам нужно сделать, – разобрать исходное значение на объект Date

 String startTime = "08/11/2008 00:00"; // This could be MM/dd/yyyy, you original value is ambiguous SimpleDateFormat input = new SimpleDateFormat("dd/MM/yyyy HH:mm"); Date dateValue = input.parse(startTime); 

Как только вы это сделаете, вы можете форматировать dateValue любым способом, который вы хотите …

 SimpleDateFormat output = new SimpleDateFormat("yyyy/MM/dd HH:mm"); System.out.println("" + output.format(dateValue) + " real date " + startTime); 

который выводит:

 2008/11/08 00:00 real date 08/11/2008 00:00 

Причина, по которой вы получаете 0014/05/01 00:00SimpleDateFormat (при использовании yyyy/MM/dd HH:mm ) использует 08 для года, 11 для месяца и 2008 дня, делает внутреннюю прокатку значений для корректировки значений до действительной даты

Это связано с тем, что исходная строка даты, которую вы разобрали, отличается от формата SimpleDateFormatter. Ваш источник находится в формате MM/dd/yyyy HH:mm . Измените строку в SimpleDateFormat на MM/dd/yyyy HH:mm .

Попробуйте использовать другой формат после вашего первого формата.

 SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("MM/dd/yyyy HH:mm"); //You gotta parse it to a Date before correcting it Date parsedDate = simpleDateFormat2.parse(startTime); simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm") String newFormatttedDate = simpleDateFormat2.format(parsedDate); 

Я хотел бы внести современный ответ.

  DateTimeFormatter currentFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm"); DateTimeFormatter convertedOutputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm"); String startTime = "08/11/2008 00:00"; LocalDateTime starting = LocalDateTime.parse(startTime, currentFormatter); System.out.println(starting.format(convertedOutputFormatter)); 

Это печатает

 2008/11/08 00:00 

Класс SimpleDateFormat вы пытались использовать, устарел и, как известно, хлопотно. Вы испытали, но немного с этим справились. Вместо этого я использую и рекомендую java.time , современный API дат и времени Java.

Как говорили другие, вам нужно использовать два форматирования: один для указания вашего текущего формата и один для указания нужного формата.

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

Ваш форматтер с шаблоном формата yyyy/MM/dd HH:mm интерпретирован 08/11/2008 как 2008-й день 11-го месяца 8-го года общей эры. Это не SimpleDateFormat с настройками по умолчанию, которые есть только 30 дней в ноябре, он просто продолжает рассчитывать на следующие месяцы и годы, заканчиваясь на дате пять с половиной лет спустя (2008 год, разделенный на 365,25, очень близок к 5,5).

Вопрос: Можно ли использовать java.time с моей версией Java?

Если вы используете хотя бы Java 6 , вы можете.

  • В Java 8 и более поздних версиях появился новый API.
  • В Java 6 и 7 получите 3Ten Backport, backport новых classов (ThreeTen для JSR 310, где впервые был описан современный API).
  • На (старше) Android используйте версию Android ThreeTen Backport. Это называется ThreeTenABP. Обязательно импортируйте classы даты и времени из пакета org.threeten.bp и подпакетов.

связи

  • Учебник Oracle: Дата Время , объясняя, как использовать java.time .
  • Проект ThreeTen Backport
  • ThreeTenABP , версия Android от ThreeTen Backport
  • Вопрос: Как использовать ThreeTenABP в Android Project с очень подробным объяснением.
  • Запрос спецификации Java (JSR) 310 .

Вы разбираете дату 08/11/2008 00:00 с форматом yyyy/MM/dd HH:mm но эта дата отсутствует в этом формате.

  • Получить вчерашнюю дату, используя Date
  • Y возвращает 2012, а y возвращает 2011 в SimpleDateFormat
  • Преобразование строк-строк с наносекундами
  • Как анализировать даты в нескольких форматах с помощью SimpleDateFormat
  • Синхронизация доступа к SimpleDateFormat
  • SimpleDateFormat игнорирует месяц при parsingе
  • Что это за формат даты? 2011-08-12T20: 17: 46.384Z
  • Невозможно проанализировать строку DateTime с маркером AM / PM
  • Как конвертировать дату в формат yyyy-MM-dd?
  • simpledateformat синтаксический анализ с буквой «Z»
  • Каковы форматы дат в classе SimpleDateFormat?
  • Давайте будем гением компьютера.