Вычесть две даты в Scala в формате ггггММдд - PullRequest
0 голосов
/ 20 марта 2020

У меня есть две даты, и я хочу получить разницу между этими двумя датами.

Предполагая, что у нас есть следующее:

dateBefore = 20200310 (yyyyMMdd)

dateAfter = 20200312 (yyyyMMdd)

Желаемый результат: 20200311

Есть идеи по коду?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вы можете сначала проанализировать строку даты в LocalDate, чтобы вы могли легко поиграть со временем, используя java .time API.

import java.time.format.DateTimeFormatter
import java.time.{ LocalDate, Period }

val format = DateTimeFormatter.ofPattern("yyyyMMdd")

val dateBefore: LocalDate = LocalDate.parse("20200310", format)
val dateAfter: LocalDate = LocalDate.parse("20200315", format)

val period: Period = Period.between(dateBefore, dateAfter)

period.getYears() // Int = 0
period.getMonths() // Int = 0
period.getDays() // Int = 5

или, если вам нужен список дат между двумя ..

val daysDiff = dateAfter.toEpochDay - dateBefore.toEpochDay //Int = 5

(1 until daysDiff).toList // List(1, 2, 3, 4)
  .map(d => dateBefore.plusDays(d).format(format)) //List(20200311, 20200312, 20200313, 20200314)
0 голосов
/ 20 марта 2020

Вы можете использовать Regex для форматирования даты, а затем использовать пакет java .time._, чтобы получить различия в днях, месяцах и годах. Также можно использовать пакет time.temporal._ для получения общего количества дней, месяцев или лет

import java.time._
import java.time.temporal._

def dateDiff(date1: Int, date2: Int): Unit = {
    val date_pattern = "(\\d{4})(\\d{2})(\\d{2})".r
    val fmt_date1 =  date_pattern.replaceAllIn(date1.toString, "$1-$2-$3")
    val fmt_date2 =  date_pattern.replaceAllIn(date2.toString, "$1-$2-$3")

    val s1 = LocalDate.parse(fmt_date1)
    val s2 = LocalDate.parse(fmt_date2)
    val p = Period.between(s1, s2)

    println(f"""Diff is ${p.getYears()} years ${p.getMonths()} months
            |${p.getDays()} days""".stripMargin.replaceAll("\n", " ")) //Diff is 2 years 0 months 2 days

    println(f"""Diff is ${ChronoUnit.YEARS.between(s1, s2)} years
            |${ChronoUnit.MONTHS.between(s1, s2)} months
            |${ChronoUnit.DAYS.between(s1, s2)} days"""
            .stripMargin.replaceAll("\n", " ")) // Diff is 2 years 24 months 733 days
}
...