java.util.Date преобразование формата yyyy-mm-dd в mm-dd-yyyy


88

У меня есть 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


2
Что вы имеете в виду, когда говорите ... У меня есть java.util.Date в формате гггг-мм-дд?
Джаямохан

Это означает, что текущий формат моего кода для отображения в пользовательском интерфейсе - yyyy-mm-dd.
user182944

1
пожалуйста, измените small mm на MM
Dilip D

Ответы:


157

Date - это контейнер для количества миллисекунд, прошедших с эпохи Unix (00:00:00 UTC 1 января 1970 г.).

В нем нет понятия формата.

Java 8+

LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);

Выходы ...

05-11-2018
2018-05-11
2018-05-11T17:24:42.980

Java 7-

Вы должны использовать ThreeTen Backport

Оригинальный ответ

Например...

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значение. Это цель DateFormatters

Обновлено с дополнительным примером

На всякий случай первый пример не имел смысла ...

В этом примере для форматирования одной даты используются два средства форматирования. Затем я использую те же средства форматирования для синтаксического анализа Stringзначений обратно в Dates. Результирующий синтаксический анализ не меняет способ 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чтобы убедиться, что вы не используете неправильные шаблоны;)


Мне помог отличный ответ. Пытался запустить образец приложения командной строки для тестирования форматов (перед использованием в классе Android) - не смог найти нужный импорт. Ни один из предоставленных ответов не помнит, чтобы включить это: import java.text.SimpleDateFormat;
raddevus 06

34
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);

Помимо этого изменения, какие-либо другие изменения, которые мне нужно внести в указанный выше метод утилиты? Я не могу сразу это проверить, поэтому и спрашиваю об этом. ТАКЖЕ, есть ли лучший способ форматирования java.util.Date?
user182944

15

'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

3

tl; dr

LocalDate.parse( 
    "01-23-2017" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)

Детали

У меня есть java.util.Date в формате гггг-мм-дд

Как уже упоминалось, у Dateкласса нет формата. Он отсчитывает миллисекунды с начала 1970 года по всемирному координированному времени. Безвоздмездно.

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 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date, Calendar, иSimpleDateFormat .

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval, YearWeek, YearQuarter, и более .


1

Это просто использовать приведенные ниже коды.

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);

(A) Этот код игнорирует важную проблему часовых поясов. (B) В этом коде используются устаревшие классы даты и времени, которые были унаследованы уже много лет. Избежать их. Заменены классами java.time.
Basil

1

Вы можете получить день, месяц и год и можете объединить их или использовать формат MM-dd-yyyy, как указано ниже.

Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);



Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);



LocalDateTime ldt1 = LocalDateTime.now();  
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy3 = ldt1.format(format1);  
System.out.println("Formatted Date 3: " + mmddyyyy3);  



LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);



LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy5 = ldt3.format(format2);   
System.out.println("Formatted Date 5: " + mmddyyyy5); 



Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);



Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);



Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);



Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);`enter code here`
System.out.println("Formatted Date 9: " + mmddyyyy9);

1

Пожалуйста, измените месяц с маленького «мм» на заглавную «ММ», это будет работать. Для справки ниже приведен пример кода.

        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);

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.