Java string naar datum conversie
Wat is de beste manier om een String
in het formaat '2 januari 2010' om te zetten naar een Datum
in Java?
Uiteindelijk wil ik de maand, de dag en het jaar uitsplitsen als gehele getallen, zodat ik
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
om de datum om te zetten in tijd.
844
3
Dat's de harde manier, en die
java.util.Date
setter methods zijn sinds Java 1.1 (1997) deprecated. Formatteer de datum gewoon metSimpleDateFormat
met een format pattern dat overeenkomt met de input string.In uw specifieke geval van "2 januari 2010" als de input string:
MMMM
patroon ervoord
patroon ervoor.yyyy
patroon ervoor.Let op het belang van het expliciete
Locale
argument. Als je het weglaat, dan zal het de standaard locale gebruiken die niet noodzakelijkerwijs Engels is zoals gebruikt in de maandnaam van de input string. Als de locale niet overeenkomt met de input string, dan zou je verwarrend genoeg eenjava.text.ParseException
krijgen, ook al lijkt het format pattern geldig.Hier's een extract van relevantie uit de javadoc, waarin alle beschikbare formaatpatronen worden opgesomd:
Merk op dat de patronen hoofdlettergevoelig zijn en dat tekstgebaseerde patronen van vier karakters of meer de volledige vorm weergeven; anders wordt een korte of afgekorte vorm gebruikt indien beschikbaar. Dus b.v.
MMMMM
of meer is niet nodig.Hier zijn enkele voorbeelden van geldige
SimpleDateFormat
patronen om een gegeven string naar datum te parsen:Een belangrijke opmerking is dat
SimpleDateFormat
niet thread safe is. Met andere woorden, je moetSimpleDateFormat
nooit declareren en toewijzen als een statische of instance variabele en deze dan hergebruiken in verschillende methodes/threads. Je moet hem altijd helemaal nieuw aanmaken binnen de methode local scope.Java 8 update
Als je toevallig op Java 8 of nieuwer zit, gebruik dan
DateTimeFormatter
(ook hier, klik op de link om alle voorgedefinieerde formatters en beschikbare format patterns te zien; de tutorial is hier beschikbaar). Deze nieuwe API is geïnspireerd door JodaTime.Opmerking: als je format pattern toevallig ook het tijdsdeel bevat, gebruik dan
LocalDateTime#parse(text, formatter)
in plaats vanLocalDate#parse(text, formatter)
. En, als je format pattern toevallig ook de tijdzone bevat, gebruik danZonedDateTime#parse(text, formatter)
in plaats vanZonedDateTime#parse(text, formatter)
.Hier's een relevant uittreksel uit de javadoc, met een lijst van alle beschikbare formaat patronen:
Merk op dat het verschillende voorgedefinieerde formatters heeft voor de meer populaire patronen. Dus in plaats van bijvoorbeeld
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, zou jeDateTimeFormatter.RFC_1123_DATE_TIME
kunnen gebruiken. Dit is mogelijk omdat ze, in tegenstelling totSimpleDateFormat
, thread safe zijn. Je zou dus ook je eigen kunnen definiëren, indien nodig.Voor een bepaald input string formaat hoef je geen expliciete
DateTimeFormatter
te gebruiken: een standaard ISO 8601 datum, zoals 2016-09-26T17:44:57Z, kan direct metLocalDateTime#parse(text)
worden geparseerd, omdat die al deISO_LOCAL_DATE_TIME
formatter gebruikt. Op dezelfde manier parseertLocalDate#parse(text)
een ISO datum zonder de tijdcomponent (zieISO_LOCAL_DATE
), en parseertZonedDateTime#parse(text)
een ISO datum met een offset en toegevoegde tijdzone (zieISO_ZONED_DATE_TIME
).Ah ja, de Java Datum discussie, alweer. Om met datummanipulatie om te gaan gebruiken we Date, Calendar, GregorianCalendar, en SimpleDateFormat. Bijvoorbeeld, met de datum van januari als invoer:
Dan kun je dat manipuleren met iets als:
Terwijl je bezig bent met de SimpleDateFormat klasse, is het belangrijk te onthouden dat Date niet thread-safe is en dat je een enkel Date object niet kunt delen met meerdere threads.
Er is ook een groot verschil tussen "m" en "M" waar kleine letters worden gebruikt voor minuten en hoofdletters voor maand. Hetzelfde geldt voor "d" en "D". Dit kan subtiele bugs veroorzaken die vaak over het hoofd worden gezien. Zie Javadoc of Guide to Convert String to Date in Java voor meer details.