Работа с датами в Котлине

Работа с датами в Котлине

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

В этом кратком руководстве мы узнаем, как работать с датами в Kotlin.

Мы рассмотрим операции, связанные сDate-, такие как создание, форматирование и изменение дат.

2. Создание даты

Самый быстрый способ создать объектDate - использовать методLocalDate‘sparse():

var date = LocalDate.parse("2018-12-12")

Методparse()  по умолчанию используетstandard date formatyyyy-MM-dd.

Мы также можем передать наш собственный формат для анализа строки даты:

var formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")
var date = LocalDate.parse("31-12-2018", formatter)

И, если нам нужно больше контроля, мы можемexplicitly specify the year, day and month using LocalDate‘s of() method:

var date = LocalDate.of(2018, 12, 31)

3. Форматирование даты

Затем давайте посмотрим, как мы можем отформатировать наши объекты даты обратно вStrings.

Стандартный способ форматирования даты с использованием формата по умолчанию вKotlin  - это вызовtoString() method.

Давай назначим дату

var date = LocalDate.parse("2018-12-31")

и посмотрите на вывод по умолчанию с использованиемtoString:

assertThat(date.toString()).isEqualTo("2018-12-31")

Это выглядит удобочитаемым, поскольку выходной формат -yyyy-MM-dd, но, опять же, нам может потребоваться отформатировать дату в пользовательских форматах в зависимости от наших сценариев использования.

To format our date to different formats we can use LocalDate‘s format() method и передать ему наш собственный формат, используяDateTimeFormatter:

var formatter = DateTimeFormatter.ofPattern("dd-MMMM-yyyy")
var formattedDate = date.format(formatter)

Это выводит красиво отформатированную дату:

assertThat(formattedDate).isEqualTo("31-December-2018")

4. Извлечение компонентов даты

LocalDate предоставляет множество методов, которые мы можем использовать для извлечения определенных компонентов изDate.

Некоторые из них довольно тривиальны, например, извлечение года, месяца или дня изDate:

var date = LocalDate.parse("2018-12-31")
assertThat(date.year).isEqualTo(2018)
assertThat(date.month).isEqualTo(Month.DECEMBER)
assertThat(date.dayOfMonth).isEqualTo(31)

Мы также можем извлечь другую информацию, такую ​​как era, dayOfTheWeek или dayOfTheMonth:

assertThat(date.era.toString()).isEqualTo("CE")
assertThat(date.dayOfWeek).isEqualTo(DayOfWeek.MONDAY)
assertThat(date.dayOfYear).isEqualTo(365)

5. Работа сPeriod

Наконец, давайте рассмотрим работу сPeriods в Kotlin.

Точки представляют собой расстояние на временной шкале. Мы можем создатьPeriod, используя метод фабрики классовPeriod:

var period = Period.of(1, 2, 3)

Это создаетPeriod из 1 года, 2 месяцев и 3 дней.

Чтобы добавить этотPeriod к существующей дате, мы используем методLocalDate ’splus() :

var date = LocalDate.of(2018, 6, 25)
var modifiedDate = date.plus(period)

Это добавит 1 год, 2 месяца и 3 дня к данной дате и даст модифицированную дату:

assertThat(modifiedDate).isEqualTo("2019-08-28")

Точно так же мы можем вычестьPeriod  из заданной даты:

var date = LocalDate.of(2018, 6, 25)
var modifiedDate = date.minus(period)

И, как ожидается, измененная дата будет:

assertThat(modifiedDate).isEqualTo("2017-04-22")

Также мы можем использовать Периоды для представления расстояния между двумя датами.

Предположим, у нас есть две даты с интервалом ровно в 6 месяцев друг от друга:

var date1 = LocalDate.parse("2018-06-25")
var date2 = LocalDate.parse("2018-12-25")

Теперь мы можем представить расстояние между этими двумя датами, используя метод Periodbetween :

var period = Period.between(date1, date2)

Переменнаяperiod даст следующий:

assertThat(period.toString()).isEqualTo("P6M")

P означаетPeriod, а6M означает 6 месяцев.

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

В этой статье мы познакомились с основами работы с датами в Котлине.

Мы рассмотрели, как создавать экземпляры даты, используя различные методы, и как форматировать объекты даты обратно в читаемый текст.

Кроме того, мы рассмотрели извлечение компонентов из объектовDate и, наконец, как работать сPeriods в Kotlin.

Код, используемый в этом руководстве, доступенover on Github.