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);
Jeg bruger de moderne klasser i java.time
pakke. Du bemærker, at koden ikke kun er enklere, når du først har stiftet bekendtskab med de nyere klassers flydende skrivestil, er den også tydeligere.
Hvis du ville være 100 % moderne, bør du også tjekke, om din seneste MySQL JDBC-driver ikke ville acceptere en LocalDate
direkte uden konvertering til java.sql.Date
. Det burde.
Et par detaljer at bemærke
- Hvis du har brug for din kode til at køre på computere uden for din kontrol, skal du altid give din formatering en lokalitet, ellers kan din datostreng ikke parses på en computer med en ikke-engelsktalende lokalitet. Du kan bruge
Locale.ROOT
for en lokalitetsneutral lokalitet (den taler engelsk). - Hvis du kan, så undgå de tre bogstaver tidszoneforkortelser. Mange er tvetydige. EET er egentlig kun en halv tidszone, da nogle steder, hvor det bruges, er på EEST (sommertid) nu. Bedre at bruge enten et langt tidszone-id som
Europe/Bucharest
eller en offset fra UTC som+02:00
.
Disse punkter er gyldige, uanset om du bruger DateTimeFormatter
eller SimpleDateFormat
.
Hvis du ikke kan eller ønsker at gå videre til de anbefalede nyere klasser, er rettelsen til din kode:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
Jeg bruger små bogstaver zzz
da dette er dokumenteret at matche et tidszonenavn på tre bogstaver, kender jeg den store ZZZ
virker også. Jeg har tilføjet lokalitet. Og måske vigtigst af alt, i det nødvendige format har jeg ændret YYYY
(ugebaseret år) til yyyy
(kalenderår) og DD
(dag på året) til dd
(dag i måneden). Alle disse bogstaver er i dokumentationen
.