java.util.Дата перетворення формату рррр-мм-дд в мм-дд-рррр


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
будь ласка, змініть малий мм на 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-

Ви повинні скористатися BackTort ThreeTen

Оригінальна відповідь

Наприклад...

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

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

Окрім цієї зміни, будь-яку іншу зміну, яку мені потрібно внести у вищевказаному методі util? Я не можу перевірити це відразу, отже, запитую це. ТАКЖЕ, чи є кращий спосіб форматування файлу 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; д-р

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

Деталі

У мене є java.util.Date у форматі рррр-мм-дд

Як зазначалось, 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

Якщо вам важлива лише дата без часу доби, витягніть a LocalDate.

LocalDate localDate = zdt.toLocalDate();

Щоб згенерувати рядок у стандартному форматі ISO 8601, РРРР-ММ-ДД, просто зателефонуйте toString. Класи java.time використовують стандартні формати за замовчуванням при генерації / аналізі рядків.

String output = localDate.toString();

23.01.2017

Якщо вам потрібен формат MM-DD-YYYY, визначте шаблон форматування.

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 . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

Де отримати класи java.time?

  • Java SE 8 і SE 9 і пізніших версій
    • Вбудований.
    • Частина стандартного Java API із комплексною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 і SE 7
    • Значна частина функцій java.time переноситься назад на Java 6 і 7 у ThreeTen-Backport .
  • Android

Проект 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.
Василь Бурк,

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.