konwersja formatu java.util.Date rrrr-mm-dd na mm-dd-rrrr


88

Mam java.util.Datew formacie yyyy-mm-dd. Chcę, żeby był w formaciemm-dd-yyyy

Poniżej znajduje się przykładowe narzędzie, które wypróbowałem dla tej konwersji:

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

Nadal otrzymuję dane wyjściowe nie w formacie mm-dd-yyyy.

Daj mi znać, jak sformatować java.util.Dateod yyyy-mm-dddomm-dd-yyyy


2
Co masz na myśli mówiąc… Mam java.util.Date w formacie rrrr-mm-dd?
Jayamohan

Oznacza to, że obecny format w moim kodzie do wyświetlania go w interfejsie użytkownika to yyyy-mm-dd.
user182944

1
proszę zmienić małe mm na MM
Dilip D

Odpowiedzi:


157

Date jest pojemnikiem na liczbę milisekund od epoki Uniksa (00:00:00 czasu UTC 1 stycznia 1970 r.).

Nie ma koncepcji formatu.

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

Wyjścia ...

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

Java 7-

Powinieneś korzystać z ThreeTen Backport

Oryginalna odpowiedź

Na przykład...

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

Wyjścia ...

Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013

Żadne z formatowania nie zmieniło podstawowej Datewartości. Taki jest cel DateFormatters

Zaktualizowano o dodatkowy przykład

Na wypadek, gdyby pierwszy przykład nie miał sensu ...

W tym przykładzie zastosowano dwa elementy formatujące do sformatowania tej samej daty. Następnie używam tych samych elementów formatujących, aby przeanalizować Stringwartości z powrotem do Dates. Wynikowa analiza nie zmienia sposobu Datezgłaszania swojej wartości.

Date#toStringto tylko zrzut zawartości. Nie możesz tego zmienić, ale możesz sformatować Dateobiekt w dowolny sposób

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

Które wyjścia ...

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

Uważaj także na wzorce formatu. Przyjrzyj się bliżej, SimpleDateFormataby upewnić się, że nie używasz niewłaściwych wzorców;)


Świetna odpowiedź mi pomogła. Próbowałem uruchomić przykładową aplikację wiersza poleceń, aby przetestować formaty (przed użyciem w klasie Androida) - nie mogłem znaleźć potrzebnego importu. Żadna z udzielonych odpowiedzi nie pamięta o uwzględnieniu tego: import java.text.SimpleDateFormat;
raddevus

34
SimpleDateFormat("MM-dd-yyyy");

zamiast

SimpleDateFormat("mm-dd-yyyy");

dlatego MM points Month,mm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);

Oprócz tej zmiany, jakąkolwiek inną zmianę, którą muszę wprowadzić w powyższej metodzie util? Nie jestem w stanie tego od razu przetestować, dlatego o to pytam. Czy jest też lepszy sposób formatowania java.util.Date?
user182944

15

„M” (wielka) reprezentuje miesiąc, a „m” (prosta) reprezentuje minuty

Jakiś przykład od miesięcy

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

Jakiś przykład na minuty

'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" )
)

Detale

Mam java.util.Date w formacie rrrr-mm-dd

Jak wspomniano wcześniej, Dateklasa nie ma formatu. Od początku 1970 roku liczony jest w milisekundach czasu UTC. Nieskrępowany.

java.time

Inne odpowiedzi używają kłopotliwych starych klas daty i czasu, teraz zastąpionych przez klasy java.time.

Jeśli masz java.util.Date, przekonwertuj na Instantobiekt. InstantKlasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).

Instant instant = myUtilDate.toInstant();

Strefa czasowa

Inne odpowiedzi pomijają kluczową kwestię strefy czasowej. Określenie daty wymaga podania strefy czasowej. W dowolnym momencie data różni się na całym świecie według strefy. Kilka minut po północy w Paryżu Francja to nowy dzień, podczas gdy w Montrealu Québec wciąż trwa „wczoraj”.

Zdefiniuj strefę czasową, według której chcesz mieć kontekst dla swojego Instant.

ZoneId z = ZoneId.of( "America/Montreal" );

Zastosuj, ZoneIdaby uzyskać ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z );

LocalDate

Jeśli zależy Ci tylko na dacie bez pory dnia, wyodrębnij plik LocalDate.

LocalDate localDate = zdt.toLocalDate();

Aby wygenerować ciąg znaków w standardowym formacie ISO 8601, RRRR-MM-DD, po prostu zadzwoń toString. Klasy java.time używają domyślnie standardowych formatów podczas generowania / analizowania ciągów.

String output = localDate.toString();

2017-01-23

Jeśli chcesz mieć format MM-DD-RRRR, zdefiniuj wzorzec formatowania.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );

Zwróć uwagę, że w kodach wzorców formatowania rozróżniana jest wielkość liter. Kod w pytaniu nieprawidłowo użyty mm(minuta godziny) zamiast MM(miesiąc roku).

Użyj tego samego DateTimeFormatterobiektu do analizy. Klasy java.time są bezpieczne dla wątków, więc można przechowywać ten obiekt i używać go wielokrotnie, nawet w wielu wątkach.

LocalDate localDate = LocalDate.parse( "01-23-2017" , f );

Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Skąd wziąć klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .


1

Jest to proste użycie poniżej kodów.

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) Ten kod pomija kluczową kwestię stref czasowych. (B) Ten kod używa kłopotliwych starych klas daty i czasu, które są starsze od lat. Unikaj ich. Zastąpione przez klasy java.time.
Basil Bourque

1

Możesz otrzymać dzień, miesiąc i rok i możesz je łączyć lub możesz użyć formatu MM-dd-rrrr, jak podano poniżej.

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

Zmień miesiąc z małym „mm” na duże „MM”. W celach informacyjnych poniżej znajduje się przykładowy kod.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.