Trabalhando com datas com Kotlin Datetime
Trabalhar com datas é, sem duvidas, uma dificuldade na programação, principalmente quando não temos muita experiência com elas. Geralmente, em Java e Kotlin, quando vamos precisar trabalhar com elas, costumamos usar a classe Calendar ou Date para realizar o que tem de ser feito. Porém, enfrentamos muitas dificuldades ao seguir nessa abordagem. Visando melhorar isso, surgiu a biblioteca do Kotlinx-datetime.
Essa biblioteca nos provém os tipos básicos para trabalhar com data e hora:
Instant: Representa um momento na escala de tempo UTC-SLS.Clock: Para obter a hora atual.LocalDateTime: Para receber a data e a hora sem a referência de uma Timezone.LocalDate: Representa os componentes somente de datas.LocalTime: Representa os componentes somente de horas.TimeZone: Provém as informações de uma Timezone específica.DateTimePeriod: Para prover a diferença entre duas datas.
Casos de uso.
Use Instant para representar um registro de data e hora do evento que já aconteceu no passado ou definitivamente acontecerá em um instante de tempo bem definido no futuro não muito distante de agora (como uma confirmação de pedido prazo em 1 hora a partir de agora).
Use LocalDateTime para representar um horário do evento que está programado para acontecer em um futuro distante em um determinado horário local (como uma reunião agendada daqui a alguns meses). Você terá que acompanhar o fuso horário do evento agendado separadamente.
Use LocalDate para representar uma data do evento que não tenha um horário específico associado a ele (como uma data de nascimento).
Use LocalTime para representar uma hora do evento que não tem uma data específica associada a ele.
Operações.
Para obter um Instant correspondente ao momento atual, use a função now().
val currentMoment = Clock.System.now()
Convertendo um instante em componentes de data e hora locais.
val currentMoment: Instant = Clock.System.now()
val datetimeInUtc: LocalDateTime = currentMoment.toLocalDateTime(TimeZone.UTC)val datetimeInSystemZone: LocalDateTime = currentMoment.toLocalDateTime(TimeZone.currentSystemDefault())
Utilizando o currentSystemDefault() você utilizará a timezone atual do aparelho. Porém, você também pode alterar a timezone para qualquer lugar do mundo, utilizando:
val tzBerlin = TimeZone.of("Europe/Berlin")
val datetimeInBerlin = currentMoment.toLocalDateTime(tzBerlin)
Aritmética instantânea.
Para obter a diferença de calendário entre dois instantes, você pode usar a função Instant.periodUntil(Instant, TimeZone).
val now = Clock.System.now()
val instantInThePast: Instant = Instant.parse("2020-01-01T00:00:00Z")
val durationSinceThen: Duration = now - instantInThePast
val equidistantInstantInTheFuture: Instant = now + durationSinceThen
então:
val period: DateTimePeriod = instantInThePast.periodUntil(Clock.System.now(), TimeZone.UTC)
Você também pode somar momentos à um determinado instante com o método plus:
val now = Clock.System.now()
val systemTZ = TimeZone.currentSystemDefault()
val tomorrow = now.plus(2, DateTimeUnit.DAY, systemTZ)
E esse resultado será o dia atual mais 2.
Implementação
Para implementar o Kotlin Datetime é muito simples, basta por a depêndencia
implementation(“org.jetbrains.kotlinx:kotlinx-datetime:0.4.0”)
no seu build.gradle e começar a codar :)
Para mais informações, consultar o repositório oficial da biblioteca: