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, Date
klasa 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 Instant
obiekt. Instant
Klasa 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, ZoneId
aby 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 DateTimeFormatter
obiektu 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?
- Java SE 8 i SE 9 i nowsze
- Wbudowany.
- Część standardowego interfejsu API języka Java z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i SE 7
- Wiele funkcji java.time jest przenoszonych z powrotem do Javy 6 i 7 w ThreeTen-Backport .
- Android
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 .