Converteer java.util.Date naar String

1. Overzicht

In deze tutorial laten we zien hoe we dat kunnen converteren Datum bezwaar tegen Draad objecten in Java. Om dit te doen, werken we samen met de ouderen java.util.Date type evenals met de nieuwe Datum Tijd API geïntroduceerd in Java 8.

Als u wilt leren hoe u de tegenovergestelde conversie uitvoert, d.w.z. van Draad naar Datum typen, kun je deze tutorial hier bekijken.

Voor meer details over nieuw Datum Tijd API, zie deze gerelateerde tutorial.

2. Converteren java.util.Date naar Draad

Hoewel we niet zouden moeten gebruiken java.util.Date als we met Java 8 werken, hebben we soms geen keus (we ontvangen bijvoorbeeld het Datum object uit een bibliotheek die niet onder onze controle staat).

In dergelijke gevallen hebben we verschillende manieren om te converteren java.util.Date naar Draad tot onze beschikking.

2.1. Voorbereiding van het Datum Voorwerp

Laten we eerst een verwacht verklaren Draad representatie van onze datum en definieer een patroon van het gewenste datumnotatie:

private static final String EXPECTED_STRING_DATE = "1 aug. 2018 12:00 uur"; private static final String DATE_FORMAT = "MMM d, jjjj HH: mm a";

Nu hebben we echt nodig Datum object dat we willen converteren. We gebruiken een Kalender instantie om het te maken:

TimeZone.setDefault (TimeZone.getTimeZone ("CET")); Calendar calendar = Calendar.getInstance (); calendar.set (2018, Calendar AUGUSTUS, 1, 12, 0); Datum datum = kalender.getTime ();

We hebben de standaard ingesteld Tijdzone naar CET om problemen bij het werken met de nieuwe API later te voorkomen. Dat moeten we opmerken de Datum zelf heeft geen tijdzone, maar zijn toString () gebruikt de huidige standaard tijdzone.

We zullen dit gebruiken Datum voorbeeld in al onze onderstaande voorbeelden.

2.2. De ... gebruiken SimpleDateFormat Klasse

We maken gebruik van de formaat() methode van de SimpleDateFormat class in dit voorbeeld. Laten we er een instantie van maken door ons datumnotatie te gebruiken:

DateFormat-formatter = nieuwe SimpleDateFormat (DATE_FORMAT);

Hierna kunnen we onze datum opmaken en vergelijken met de verwachte output:

String formattedDate = formatter.format (datum); assertEquals (EXPECTED_STRING_DATE, formattedDate);

2.3. Met behulp van de Abstract Datumnotatie Klasse

Zoals we hadden kunnen zien, SimpleDateFormat is een subklasse van het abstract Datumnotatie klasse. Deze klasse biedt verschillende methoden voor het formatteren van datum en tijd.

We zullen het gebruiken om dezelfde output te bereiken als hierboven:

String formattedDate = DateFormat .getDateTimeInstance (DateFormat.MEDIUM, DateFormat.SHORT) .format (datum);

Met deze aanpak passeren we stijlpatronen - MEDIUM voor de datum en KORT voor de tijd in ons geval.

3. Gebruik de Formatter Klasse

Een andere eenvoudige manier om hetzelfde te krijgen Draad zoals in eerdere voorbeelden is om de Formatter klasse.

Hoewel dit misschien niet de meest leesbare oplossing is, het is een draadveilige one-liner die handig kan zijn, vooral in een omgeving met meerdere draden (dat moeten we in gedachten houden SimpleDateFormat is niet thread-safe):

String formattedDate = String.format ("% 1 $ tb% 1 $ te,% 1 $ tY% 1 $ tI:% 1 $ tM% 1 $ Tp", datum);

We gebruikten 1$ om aan te geven dat we slechts één argument doorgeven dat bij elke vlag moet worden gebruikt. Een gedetailleerde uitleg van de vlaggen is te vinden in het gedeelte Datum- / tijdconversies van het Formatter klasse.

4. Converteren met Java 8 Datum / tijd-API

De Datum Tijd API van Java 8 is veel krachtiger dan de java.util.Date en java.util.Calendar klassen, en we zouden het waar mogelijk moeten gebruiken. Laten we eens kijken hoe we het kunnen gebruiken om ons bestaande te converteren Datum bezwaar maken tegen Draad.

Deze keer gebruiken we de DateTimeFormatter klasse en zijn formaat() methode, evenals hetzelfde datumpatroon, gedeclareerd in Sectie 2.1:

DateTimeFormatter-formatter = DateTimeFormatter.ofPattern (DATE_FORMAT);

Om de nieuwe API te gebruiken, moeten we converteren onze Datum bezwaar maken tegen een Onmiddellijk voorwerp:

Instant instant = date.toInstant ();

Omdat we hadden verwacht Draad heeft zowel datum- als tijddelen, we moeten ook de Onmiddellijk bezwaar maken tegen LocalDateTime:

LocalDateTime ldt = instant .atZone (ZoneId.of ("CET")) .toLocalDateTime ();

En tot slot kunnen we onze opmaak gemakkelijk krijgen Draad:

String formattedDate = ldt.format (formatter);

5. Conclusie

In dit artikel hebben we geïllustreerd verschillende manieren om te converteren java.util.Date bezwaar tegen Draad. We hebben eerst laten zien hoe je dat kunt doen met behulp van de oudere java.util.Date en java.util.Calendar klassen en bijbehorende datumnotatieklassen.

Vervolgens gebruikten we de Formatter class en, tot slot, de Java 8 Date / Time API.

Zoals altijd is de volledige broncode te vinden op GitHub.