Работа с датами в Kotlin: обзор библиотек и инструментов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с датами в Kotlin: обзор библиотек и инструментов

Работа с датами и временем — одна из ключевых задач в большинстве приложений. В Kotlin, как в современном мультиплатформенном языке, существует несколько способов работы с датами. В этой статье мы рассмотрим основные библиотеки и инструменты, которые помогут вам эффективно управлять датами, временем, интервалами и часовыми поясами в проектах на Kotlin.

1. Стандартная библиотека Java: java.time

Поскольку Kotlin полностью совместим с Java, вы можете использовать мощную библиотеку java.time (JSR-310), которая появилась в Java 8. Это рекомендуемый способ для серверных и Android-приложений (начиная с API 26+).

Основные классы:

  • LocalDate — дата без времени (год, месяц, день).
  • LocalTime — время без даты.
  • LocalDateTime — дата и время без часового пояса.
  • ZonedDateTime — дата и время с часовым поясом.
  • Instant — момент времени в UTC (машинное время).
  • Duration и Period — интервалы времени.

Пример использования:

import java.time.*

fun main() {
    // Текущая дата и время
    val now = LocalDateTime.now()
    println("Сейчас: $now")

    // Создание конкретной даты
    val birthDate = LocalDate.of(1990, Month.JUNE, 15)
    println("Дата рождения: $birthDate")

    // Работа с часовыми поясами
    val zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"))
    println("Время в Москве: $zonedDateTime")

    // Разница между датами
    val from = LocalDate.of(2023, 1, 1)
    val to = LocalDate.now()
    val daysBetween = ChronoUnit.DAYS.between(from, to)
    println("Дней с Нового года: $daysBetween")

    // Форматирование
    val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
    println("Форматированная дата: ${now.format(formatter)}")
}

Преимущества: встроенная, надежная, полная поддержка всех функций.

Недостатки: не поддерживается на старых Android (до API 26) без десингара.

2. kotlinx-datetime (мультиплатформенная библиотека от JetBrains)

Для мультиплатформенных проектов (KMP) JetBrains создала библиотеку kotlinx-datetime. Она предоставляет единый API для всех платформ (JVM, Native, JS).

Основные классы:

  • Instant — момент времени в UTC.
  • LocalDateTime — дата+время без часового пояса.
  • LocalDate и LocalTime.
  • DateTimePeriod и DatePeriod — интервалы.
  • TimeZone — часовой пояс.

Пример использования:

import kotlinx.datetime.*

fun main() {
    // Текущий момент
    val now = Clock.System.now()
    println("Текущий UTC: $now")

    // Преобразование в локальное время
    val localDateTime = now.toLocalDateTime(TimeZone.currentSystemDefault())
    println("Локальное время: $localDateTime")

    // Создание даты
    val date = LocalDate(2024, 12, 25)
    println("Дата: $date")

    // Разница между датами
    val start = LocalDateTime(2024, 1, 1, 0, 0)
    val end = LocalDateTime(2024, 12, 31, 23, 59)
    val period = start.periodUntil(end, DateTimeUnit.DAY)
    println("Дней между: $period")

    // Форматирование (требуется отдельная библиотека или ручное)
    println("Год: ${localDateTime.year}, месяц: ${localDateTime.monthNumber}")
}

Преимущества: мультиплатформенность, легковесность, официальная поддержка.

Недостатки: ограниченные возможности форматирования (нет встроенного DateTimeFormatter).

3. ThreeTenABP (для Android ниже API 26)

Если вы разрабатываете под Android с minSdk ниже 26, используйте библиотеку ThreeTenABP — адаптацию java.time для старых версий Android.

Подключение (build.gradle):

implementation 'com.jakewharton.threetenabp:threetenabp:1.4.0'
                
    
    

Рекомендаций