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.ROOTdla 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/Bucharestlub 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
.