Конвертирайте java.util.Date в String

1. Общ преглед

В този урок ще покажем как можем да конвертираме обектите Date в String обекти в Java . За целта ще работим с по-стария тип java.util.Date , както и с новия API за дата / час, въведен в Java 8.

Ако искате да научите как да направите обратното преобразуване, т.е. от типове String към Date , можете да разгледате този урок тук.

За повече подробности относно новия API за дата / час , моля, вижте този урок.

2. Преобразуване на java.util.Date в String

Въпреки че не трябва да използваме java.util.Date, ако работим с Java 8, понякога нямаме избор (например получаваме обекта Date от библиотека, която не е под наш контрол).

В такива случаи имаме няколко начина да конвертираме java.util.Date в String на наше разположение.

2.1. Подготовка на обекта за дата

Нека първо декларираме очаквано String представяне на нашата дата и дефинираме модел на желания формат на датата:

private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM"; private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";

Сега се нуждаем от действителен обект Date , който бихме искали да конвертираме. Ще използваме екземпляр на Календар, за да го създадем:

TimeZone.setDefault(TimeZone.getTimeZone("CET")); Calendar calendar = Calendar.getInstance(); calendar.set(2018, Calendar.AUGUST, 1, 12, 0); Date date = calendar.getTime();

Задали сме TimeZone по подразбиране на CET, за да предотвратим проблеми при работа с новия API по-късно. Трябва да отбележим, че самата дата няма никаква часова зона, но нейната toString () използва текущата часова зона по подразбиране .

Ще използваме този екземпляр Date във всички наши примери по-долу.

2.2. Използване на клас SimpleDateFormat

В този пример ще използваме метода format () на класа SimpleDateFormat . Нека създадем негов екземпляр, като използваме нашия формат за дата:

DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);

След това можем да форматираме нашата дата и да я сравним с очакваната продукция:

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

2.3. Използване на абстрактния клас DateFormat

Както видяхме, SimpleDateFormat е подклас на абстрактния клас DateFormat . Този клас предоставя различни методи за форматиране на дата и час.

Ще го използваме, за да постигнем същия резултат като по-горе:

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

С този подход предаваме стилови модели - СРЕДНИ за датата и КРАТКИ за времето в нашия случай.

3. Използване на Formatter Class

Друг прост начин за получаване на същия низ като в предишните примери е използването на класа Formatter .

Макар че това може да не е най-четимото решение, това е безопасно за нишки еднопосочно покритие, което може да бъде полезно, особено в среда с много нишки (трябва да имаме предвид, че SimpleDateFormat не е безопасно за нишки):

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

Използвахме 1 $, за да покажем, че ще предаваме само един аргумент, който да се използва с всеки флаг. Подробно обяснение на флаговете може да се намери в частта Преобразувания на дата / час на класа Formatter .

4. Конвертиране с помощта на Java 8 API за дата и час

The Date / Time API от Java 8 е много по-мощен, отколкото java.util.Date и java.util.Calendar класове, а ние трябва да го използвате, когато е възможно. Нека да видим как можем да го използваме за преобразуване на съществуващия ни обект Date в String .

Този път ще използваме класа DateTimeFormatter и неговия метод format () , както и същия модел на дата, деклариран в Раздел 2.1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

За да използваме новия API, трябва да преобразуваме нашия обект Date в незабавен обект:

Instant instant = date.toInstant();

Тъй като нашият очакван String има както дата, така и час, ние също трябва да конвертираме Instant обекта в LocalDateTime :

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

И накрая, можем лесно да получим нашия форматиран низ :

String formattedDate = ldt.format(formatter);

5. Заключение

В тази статия илюстрирахме няколко начина за конвертиране на обекти java.util.Date в String . Първо показахме как да направим това, като използваме по-старите класове java.util.Date и java.util.Calendar и съответните класове за форматиране на дати.

След това използвахме класа Formatter и накрая Java 8 Date / Time API.

Както винаги, пълен изходен код може да бъде намерен в GitHub.