tl; dr
LocalDateTime.parse(
"2012-07-10 14:58:00.000000".replace(" " , "T")
)
Mikrosekundach nie pasują
Próbujesz wycisnąć wartość z mikrosekund (cyfry sześć dziesiętne) do typu danych może jedynie rozdzielczość milisekund (trzy cyfry po przecinku) . To jest niemożliwe.
Zamiast tego należy użyć typu danych o wystarczająco dokładnej rozdzielczości. Klasa java.time używa rozdzielczości nanosekund (dziewięć cyfr dziesiętnych).
wejście Unzoned nie pasuje do strefowego typ
Próbujesz umieścić wartość pozbawiona offsetu z-UTC lub strefy czasowej w typ danych (Date
), który reprezentuje wartości tylko w UTC. Więc dodajesz informacje (przesunięcie UTC), które nie są zamierzone przez dane wejściowe.
Zamiast tego należy użyć odpowiedniego typu danych. W szczególności, java.time.LocalDateTime
.
Case-wrażliwy
inne odpowiedzi i komentarze poprawnie wyjaśnić, że kody wzór formatowania jest rozróżniana. Tak więc MM
i mm
mają różne efekty.
Unikaj klas starszych
kłopotliwego starych klas date-time w pakiecie z najwcześniejszych wersjach Java są teraz Legacy, wyparta przez klasy java.time wbudowanych w Java 8 i późniejszych.
ISO 8601
struny wejściowe prawie zgodne z ISO 8601 standardowych formatach. Wymień SPACE w środku na T
, aby zachować pełną zgodność.
Klasy java.time używają standardowych formatów domyślnie podczas analizowania/generowania ciągów. Więc nie trzeba określać wzorca formatowania.
obiekty Date-Time nie mają "format"
i muszę wynikowy obiekt Date być tego samego formatu.
Nie, obiekty daty i czasu nie mają "formatu". Nie łącz obiektów daty i czasu z samymi ciągami. Ciągi są wejściami i wyjściami obiektów. Obiekty przechowują własne wewnętrzne reprezentacje informacji o dacie i godzinie, których szczegóły są dla nas niezwiązane jako wywołujące programistów.
java.time
Twój wkład jest pozbawiona wskaźnik offsetowej-z-UTC lub kłopotliwego strefie mnie. Parsujemy więc jako obiekty pozbawione tych pojęć.
String input = "2012-07-10 14:58:00.000000".replace(" " , "T") ;
LocalDateTime ldt = LocalDateTime.parse(input) ;
Generowanie ciągów
Aby wygenerować ciąg reprezentujący wartość swojego LocalDateTime
:
- połączenia
toString
uzyskać ciąg w standardowym formacie ISO 8601.
- Stosowanie
DateTimeFormatter
do tworzenia ciągów w niestandardowych formatach lub automatycznie lokalizowanych formatach.
Przepełnienie stosu przeszukiwania w celu uzyskania dodatkowych informacji, ponieważ tematy te zostały już wiele razy omówione.
ZonedDateTime
LocalDateTime
robi nie stanowią dokładny punkt na osi czasu.
Aby określić aktualny moment, należy przypisać strefę czasową. Na przykład południe w Kolkata India przychodzi dużo wcześniej niż południe w Paryżu we Francji. Południe bez strefy czasowej może się zdarzyć w dowolnym momencie w zakresie około 26-27 godzin.
ZoneId z = ZoneId.of("Asia/Kolkata") ;
ZonedDateTime zdt = ldt.atZone(z) ;
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.
Użytkownik może wymieniać obiekty java.time bezpośrednio z bazą danych. Użyj JDBC driver zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby ciągi, nie ma potrzeby klas java.sql.*
.
Gdzie można uzyskać lekcje java.time?
- Java SE 8, Java SE 9, a później
- wbudowanej.
- Część standardowego interfejsu API języka Java z pakietem implementacji.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i Java SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
- Późniejsze wersje Androida wdrożeń wiązce klas java.time.
- Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….
Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval
, YearWeek
, YearQuarter
i more.
Co daje wynik "Wt 10 stycznia 14:58:00 EST 2012"? Czy używasz 'System.out.println (thisDate)'? – Gili
Używasz 'mm' dla minut i miesięcy. Jak dokładnie oczekiwałeś, że 'SimpleDateFormat' rozróżni minuty i miesiące w podanym ciągu? Przeczytaj ponownie tabelę wzorów w javadoc: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html – BalusC
@Gili: Tak, używam System.out.println (thisDate). –