LocalDate date4 = ZonedDateTime
.parse(date, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH))
.toLocalDate();
java.sql.Date date5 = java.sql.Date.valueOf(date4);
Korzystam z nowoczesnych klas w java.time
pakiet. Zauważasz, że kod jest nie tylko prostszy, ale po zapoznaniu się z płynnym stylem pisania nowszych klas jest on również bardziej przejrzysty.
Jeśli chcesz być w 100% nowoczesny, powinieneś również sprawdzić, czy Twój najnowszy sterownik MySQL JDBC nie zaakceptuje LocalDate
bezpośrednio bez konwersji do java.sql.Date
. Powinno.
Kilka szczegółów do zapamiętania
- Jeśli chcesz, aby Twój kod działał na komputerach poza Twoją kontrolą, zawsze podawaj ustawienia regionalne swojemu programowi formatującemu, w przeciwnym razie ciąg daty nie może zostać przeanalizowany na komputerze z ustawieniami regionalnymi nieanglojęzycznymi. Możesz użyć
Locale.ROOT
dla neutralnej lokalizacji (mówi po angielsku). - Jeśli możesz, unikaj trzyliterowych skrótów stref czasowych. Wiele jest niejednoznacznych. EET to tak naprawdę tylko połowa strefy czasowej, ponieważ niektóre miejsca, w których jest używany, są teraz w EEST (czas letni). Lepiej użyć długiego identyfikatora strefy czasowej, takiego jak
Europe/Bucharest
lub przesunięcie względem czasu UTC, takie jak+02:00
.
Te punkty są ważne bez względu na to, czy używasz DateTimeFormatter
lub SimpleDateFormat
.
Jeśli nie możesz lub nie chcesz przejść do zalecanych nowszych klas, poprawka w kodzie to:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
Używam małych liter zzz
ponieważ jest to udokumentowane, aby pasowało do trzyliterowej nazwy strefy czasowej, wiem, że wielkie litery ZZZ
działa też. Dodałem język. A co najważniejsze, w wymaganym formacie zmieniłem YYYY
(rok w oparciu o tydzień) na yyyy
(rok kalendarzowy) i DD
(dzień roku) do dd
(dzień miesiąca). Wszystkie te litery znajdują się w dokumentacji
.