Руководство по SimpleDateFormat

Руководство по SimpleDateFormat

1. Вступление

В этом руководстве мы возьмемin-depth tour of the SimpleDateFormat class.

Мы рассмотримsimple instantiationand formatting styles, а также полезные методы, которые класс предоставляет дляhandling locales and time zones.

Теперь, прежде чем начать, давайте запомним, чтоSimpleDateFormat  не является потокобезопасным. Поэтому принятие соответствующих мер предосторожности в параллельных средах остается за разработчиками.

2. Простое создание

Во-первых, давайте посмотрим, как создать экземпляр нового sobjectSimpleDateFormat .

Есть4 possible constructors, но в соответствии с названием давайте будем простыми. Все, что нам нужно для начала, этоString representation of a date pattern we want.

Давайте начнем с шаблона даты, разделенного тире:

"dd-MM-yyyy"

Это позволит правильно отформатировать дату, начиная с текущего дня месяца, текущего месяца года и, наконец, текущего года. Мы можем протестировать наш новый форматер с помощью простого модульного теста. Мы создадим новый объект sobjectSimpleDateFormat и передадим известную дату:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
assertEquals("24-05-1977", formatter.format(new Date(233345223232L)));

В приведенном выше кодеformatter преобразует миллисекунды какlong in в удобочитаемую дату - 24 мая 1977 года.

2.1. Фабрика Методы

ХотяSimpleDateFormat - удобный класс для быстрого создания средства форматирования даты,we’re encouraged to use the factory methods on the DateFormat classgetDateFormat(),getDateTimeFormat(),getTimeFormat().

Приведенный выше пример выглядит немного иначе при использовании этих фабричных методов:

DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
assertEquals("5/24/77", formatter.format(new Date(233345223232L)));

Как мы видим из вышеизложенного, количество вариантов форматирования заранее определяетсяfields on the DateFormat class. В основном этоrestricts our available options for formatting, поэтому в этой статье мы будем придерживатьсяSimpleDateFormat .

3. Даты разбора

SimpleDateFormat andDateFormat not позволяет нам только форматировать даты, но мы также можем отменить операцию. Используя методparse , мы можем создать эквивалентinput the String representation of a date and return the Date :

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date myDate = new Date(233276400000L);
Date parsedDate = formatter.parse("24-05-1977");
assertEquals(myDate.getTime(), parsedDate.getTime());

Здесь важно отметить, чтоpattern supplied in the constructor should be in the same format as the date parsed использует методparse .


4. Шаблоны даты и времени

SimpleDateFormat  предоставляет широкий спектр различных опций при форматировании дат. Хотя полный список доступен вJavaDocs, давайте рассмотрим некоторые из наиболее часто используемых параметров:

Письмо

Компонент даты

пример

M

Месяц

12; Декабрь

y

year

94

d

day

23; Пн

H

hour

03

m

минут

57

output returned by the date component also depends heavily on the number of characters used в пределахString. Например, возьмем июнь. Если мы определим строку даты как:

"MM"

Тогда наш результат появится в виде числового кода - 06. Однако, если мы добавим еще один M в нашу строку даты:

"MMM"

Тогда наша итоговая отформатированная дата отображается как словоJun.

5. Применение локалей

КлассSimpleDateFormat такжеsupports a wide range of locales, который устанавливается при вызове конструктора.

Давайте применим это на практике, отформатировав дату на французском языке. Мы создадим экземпляр объектаSimpleDateFormat object, предоставив конструкторLocale.FRANCE to.

SimpleDateFormat franceDateFormatter = new SimpleDateFormat("EEEEE dd-MMMMMMM-yyyy", Locale.FRANCE);
Date myWednesday = new Date(1539341312904L);
assertTrue(franceDateFormatter.format(myWednesday).startsWith("vendredi"));

Указав дату, день среды, мы можем утверждать, что нашfranceDateFormatter has правильно отформатировал дату. Новая дата правильно начинается сVendredi -French для среды!

Стоит отметить небольшую ошибку вLocale version of the constructor -whilst many locales are supported, full coverage is not guaranteed. Oracle рекомендует использовать фабричные методы вDateFormat class, чтобы обеспечить охват локали.

6. Изменение часовых поясов

ПосколькуSimpleDateFormat ex расширяет классDateFormat , мы также можемmanipulate the time zone using the setTimeZone method. Давайте посмотрим на это в действии:

Date now = new Date();

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE dd-MMM-yy HH:mm:ssZ");

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
logger.info(simpleDateFormat.format(now));

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
logger.info(simpleDateFormat.format(now));

В приведенном выше примере мы предоставляем один и тот жеDate to для двух разных часовых поясов для одного и того же объектаSimpleDateFormat. Мы также добавили‘Z' character to the end of the pattern String to indicate the time zone differences. Выходные данные методаformat затем регистрируются для пользователя.

Нажав кнопку «Run», мы увидим текущее время относительно двух часовых поясов:

INFO: Friday 12-Oct-18 12:46:14+0100
INFO: Friday 12-Oct-18 07:46:14-0400

7. Резюме

В этом руководстве мы глубоко погрузились в тонкостиSimpleDateFormat.

Мы рассмотрели, какinstantiate SimpleDateFormat , а также какpattern String impacts how the date is formatted.

Мы поигрались сchanging the locales выходной строки, прежде чем наконец поэкспериментировать сusing time zones.

Как всегда, полный исходный код можно найтиover on Github.