Преобразование java.util.Date формата yyyy-mm-dd в mm-dd-yyyy
У меня есть java.util.Date
в формате yyyy-mm-dd
. Я хочу, чтобы он был в формате mm-dd-yyyy
Ниже приведен образец, который я опробовал для этого преобразования:
// Setting the pattern
SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
// myDate is the java.util.Date in yyyy-mm-dd format
// Converting it into String using formatter
String strDate = sm.format(myDate);
//Converting the String back to java.util.Date
Date dt = sm.parse(strDate);
Но вывод, который я получаю, не в формате mm-dd-yyyy
.
Пожалуйста, дайте мне знать, как отформатировать java.util.Date
от yyyy-mm-dd
до mm-dd-yyyy
Ответы
Ответ 1
Date
является контейнером для количества миллисекунд с эпохи Unix (00:00:00 UTC 1 января 1970 года).
У него нет понятия формата.
Например...
Date myDate = new Date();
System.out.println(myDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate));
System.out.println(myDate);
Выходы...
Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013
Ни одно из форматирования не изменило базовое значение Date
. Это цель DateFormatter
s
Обновлен с дополнительным примером
На всякий случай первый пример не имеет смысла...
В этом примере используются два форматирования для форматирования одной и той же даты. Затем я использую те же самые форматиры для синтаксического анализа значений String
до Date
s. Полученный синтаксический анализ не изменяет способ сообщения Date
.
Date#toString
- это просто свалка содержимого. Вы не можете изменить это, но вы можете отформатировать объект Date
любым способом, который вам нравится
try {
Date myDate = new Date();
System.out.println(myDate);
SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");
// Format the date to Strings
String mdy = mdyFormat.format(myDate);
String dmy = dmyFormat.format(myDate);
// Results...
System.out.println(mdy);
System.out.println(dmy);
// Parse the Strings back to dates
// Note, the formats don't "stick" with the Date value
System.out.println(mdyFormat.parse(mdy));
System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
exp.printStackTrace();
}
Какие выходы...
Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013
Кроме того, будьте осторожны с форматами. Познакомьтесь с SimpleDateFormat
, чтобы убедиться, что вы не используете неправильные шаблоны;)
Ответ 2
SimpleDateFormat("MM-dd-yyyy");
вместо
SimpleDateFormat("MM-dd-yyyy");
потому что MM points Month
, mm points minutes
SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
Ответ 3
'M' (Столица) представляет месяц и 'm' (Простой) представляют минуты
Пример в течение месяцев
'M' -> 7 (without prefix 0 if it is single digit)
'M' -> 12
'MM' -> 07 (with prefix 0 if it is single digit)
'MM' -> 12
'MMM' -> Jul (display with 3 character)
'MMMM' -> December (display with full name)
Пример для минут
'm' -> 3 (without prefix 0 if it is single digit)
'm' -> 19
'mm' -> 03 (with prefix 0 if it is single digit)
'mm' -> 19
Ответ 4
TL;DR
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
Подробнее
У меня есть java.util.Date в формате yyyy-mm-dd
Как уже упоминалось, класс Date
не имеет формата. С начала 1970 года в UTC насчитывается миллисекунд. Никаких строк.
java.time
В других ответах используются неприятные старые устаревшие классы времени, которые теперь вытесняются классами java.time.
Если у вас есть java.util.Date
, конвертируйте в объект Instant
. Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунды (до девяти (9) цифр десятичной дроби).
Instant instant = myUtilDate.toInstant();
Часовой пояс
В других ответах игнорируется решающая проблема часового пояса. Для определения даты требуется часовой пояс. В любой данный момент дата изменяется по всему миру по зонам. Через несколько минут после полуночи в Париже Франция - новый день, еще "вчера" в Монреале Квебек.
Определите часовой пояс, в котором вы хотите использовать контекст для Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Примените ZoneId
, чтобы получить ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z );
LocalDate
Если вам нужна только дата без времени суток, извлеките LocalDate
.
LocalDate localDate = zdt.toLocalDate();
Чтобы сгенерировать строку в стандартном формате ISO 8601, YYYY-MM-DD, просто вызовите toString
. Классы java.time используют стандартные форматы по умолчанию при генерации/синтаксическом анализе строк.
String output = localDate.toString();
2017-01-23
Если вам нужен формат ММ-ДД-ГГГГ, определите шаблон форматирования.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
Обратите внимание, что коды шаблонов форматирования чувствительны к регистру. Код в вопросе неправильно использовал mm
(минута часа), а не mm
(месяц года).
Использовать тот же объект DateTimeFormatter
для синтаксического анализа. Классы java.time потокобезопасны, поэтому вы можете поддерживать этот объект и повторно использовать его даже по потокам.
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
О java.time
Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятный старый legacy классы даты-времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9 и позже
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Android
Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.
Ответ 5
Измените небольшой месяц "мм" на капитал "ММ", он будет работать. Для справки ниже приведен пример кода.
**Date myDate = new Date();
SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
Date dt = sm.parse(strDate);
System.out.println(strDate);**
Ответ 6
Это простое использование ниже кодов.
final Date todayDate = new Date();
System.out.println(todayDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));
System.out.println(todayDate);