tl; dr
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Europa / Paryż]
Aby wygenerować ciąg w żądanym formacie, przekaż plik DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
Detale
Inne odpowiedzi są poprawne, ale używaj starych klas daty i czasu, które są obecnie przestarzałe przez strukturę java.time.
java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Znaczna część funkcjonalności java.time jest przenoszona z powrotem do Java 6 i 7 ( ThreeTen-Backport ) i dalej dostosowywana do Androida ( ThreeTenABP ).
Najpierw zmień ciąg wejściowy, aby był zgodny z kanoniczną wersją formatu ISO 8601. Standardowe formaty ISO 8601 są używane domyślnie w klasach java.time do analizowania / generowania łańcuchów reprezentujących wartości daty i godziny. Musimy zastąpić tę SPACJĘ w środku a T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Teraz możemy go przeanalizować jako LocalDateTime
, gdzie „Lokalny” oznacza brak określonej lokalizacji. Dane wejściowe nie zawierają żadnych informacji o przesunięciu względem czasu UTC ani o strefie czasowej.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Jeśli nie interesuje Cię pora dnia ani strefa czasowa, przekonwertuj na plik LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Pierwsza chwila dnia
Jeśli zamiast tego chcesz, aby godzina była ustawiona na pierwszą porę dnia, użyj ZonedDateTime
klasy, a następnie przekonwertuj na LocalDate
obiekt, aby wywołać jego atStartOfDay
metodę. Należy pamiętać, że pierwsza chwila może nie 00:00:00
nadejść z powodu czasu letniego lub innych anomalii.
Strefa czasowa ma kluczowe znaczenie, ponieważ w dowolnym momencie data różni się na całym świecie według strefy. Na przykład, kilka chwil po północy w Paryżu to nowy dzień dla paryżan, ale dla Kanadyjczyków wciąż jest to „wczoraj” w Montrealu.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [Ameryka / Montreal]
UTC
Aby zobaczyć ten moment przez pryzmat strefy czasowej UTC , wyodrębnij Instant
obiekt. Zarówno ZonedDateTime
i, jak i Instant
będą reprezentować ten sam moment na osi czasu, ale pojawią się jako dwa różne czasy na zegarze ściennym .
An Instant
jest podstawową klasą bloków konstrukcyjnych w java.time, z definicji zawsze w UTC. Używaj tej klasy często, ponieważ generalnie powinieneś wykonywać logikę biznesową, przechowywanie danych i wymianę danych w UTC.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Widzimy 5 rano zamiast wybicia północy. W standardowym formacie, Z
na końcu jest skrótem Zulu
i oznacza „UTC”.
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 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*
klas.
Skąd wziąć klasy java.time?
- Java SE 8 , Java 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 Java SE 7
- Wiele funkcji java.time jest przenoszonych z powrotem do Java 6 i 7 w ThreeTen-Backport .
- Android
- Późniejsze wersje implementacji klas java.time w pakietach Androida.
- Dla wcześniejszej Androida (<26), ThreeTenABP projekt dostosowuje ThreeTen-backportu (jak wyżej). Zobacz Jak używać ThreeTenABP… .
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 .