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);
Използвам съвременните класове в java.time
пакет. Забелязвате, че кодът не само е по-опростен, след като се запознаете с плавния стил на писане на по-новите класове, той е и по-ясен.
Ако искате да сте 100% модерни, трябва също да проверите дали последният ви MySQL JDBC драйвер няма да приеме LocalDate
директно без преобразуване в java.sql.Date
. Би трябвало.
Няколко подробности за отбелязване
- Ако имате нужда кодът ви да се изпълнява на компютри извън вашия контрол, винаги давайте локал на вашия формататор или низът ви с дата не може да бъде анализиран на компютър с локал, който не е англоговорящ. Можете да използвате
Locale.ROOT
за неутрален локал (говори английски). - Ако можете, избягвайте съкращенията на часовата зона с три букви. Много от тях са двусмислени. EET всъщност е само половината часова зона, тъй като някои места, където се използва, сега са на EEST (лятно часово време). По-добре да използвате или дълъг идентификатор на часовата зона като
Europe/Bucharest
или отместване от UTC като+02:00
.
Тези точки са валидни, независимо дали използвате DateTimeFormatter
или SimpleDateFormat
.
Ако не можете или не искате да преминете към препоръчаните по-нови класове, корекцията на вашия код е:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
Използвам малки букви zzz
тъй като това е документирано, че съответства на трибуквено име на часовата зона, знам, че главни букви ZZZ
също работи. Добавих локал. И може би най-важното е, че в необходимия формат промених YYYY
(година на базата на седмица) до yyyy
(календарна година) и DD
(ден от годината) до dd
(ден от месеца). Всички тези писма са в документацията
.