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);
Používám moderní třídy v java.time
balík. Všimnete si, že kód je nejen jednodušší, ale jakmile se seznámíte s plynulým stylem psaní novějších tříd, je také jasnější.
Pokud chcete být 100% moderní, měli byste se také podívat, zda váš nejnovější ovladač MySQL JDBC nepřijímá LocalDate
přímo bez převodu na java.sql.Date
. Mělo by.
Několik podrobností k poznámce
- Pokud potřebujete, aby se váš kód spouštěl na počítačích mimo vaši kontrolu, vždy zadejte národní prostředí formátovacímu nástroji, jinak nebude možné řetězec data analyzovat v počítači s neanglicky mluvícím národním prostředím. Můžete použít
Locale.ROOT
pro národní prostředí neutrální (mluví anglicky). - Pokud můžete, vyhněte se třípísmenným zkratkám časového pásma. Mnohé jsou nejednoznačné. EET je skutečně jen poloviční časové pásmo, protože některá místa, kde se používá, jsou nyní na EEST (letní čas). Je lepší použít buď dlouhé ID časového pásma, jako je
Europe/Bucharest
nebo posun od UTC jako+02:00
.
Tyto body jsou platné bez ohledu na to, zda používáte DateTimeFormatter
nebo SimpleDateFormat
.
Pokud nemůžete nebo nechcete přejít na doporučené novější třídy, oprava vašeho kódu je:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
Používám malá písmena zzz
protože je zdokumentováno, že odpovídá třípísmennému názvu časového pásma, vím, že ZZZ
funguje také. Přidal jsem locale. A co je možná nejdůležitější, v potřebném formátu jsem změnil YYYY
(rok podle týdne) na yyyy
(kalendářní rok) a DD
(den v roce) do dd
(den v měsíci). Všechny tyto dopisy jsou v dokumentaci
.