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);
Jag använder de moderna klasserna i java.time
paket. Du märker att koden inte bara är enklare, när du väl har bekantat dig med den flytande skrivstilen i de nyare klasserna är den också tydligare.
Om du ville vara 100 % modern bör du också kolla om din senaste MySQL JDBC-drivrutin inte skulle acceptera en LocalDate
direkt utan konvertering till java.sql.Date
. Det borde det.
Några detaljer att notera
- Om du behöver din kod för att köras på datorer utanför din kontroll, ange alltid språk till din formatterare, annars kan din datumsträng inte tolkas på en dator med en icke-engelsktalande språkversion. Du kan använda
Locale.ROOT
för ett lokalt neutralt språk (den talar engelska). - Om du kan, undvik tidszonförkortningarna med tre bokstäver. Många är tvetydiga. EET är egentligen bara en halv tidszon eftersom vissa platser där det används är på EEST (sommartid) nu. Bättre att använda antingen ett långt tidszon-ID som
Europe/Bucharest
eller en offset från UTC som+02:00
.
Dessa punkter är giltiga oavsett om du använder DateTimeFormatter
eller SimpleDateFormat
.
Om du inte kan eller vill gå vidare till de rekommenderade nyare klasserna är korrigeringen till din kod:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
Jag använder gemener zzz
eftersom detta är dokumenterat att matcha ett tidszonnamn på tre bokstäver vet jag att ZZZ
versaler fungerar också. Jag har lagt till språk. Och kanske viktigast av allt, i det format som behövs har jag ändrat YYYY
(veckobaserat år) till yyyy
(kalenderår) och DD
(dag på året) till dd
(dagen i månaden). Alla dessa bokstäver finns i dokumentationen
.