解析日期列表以在Scala中列出字符串

问题描述

需要根据yyyyMMdd格式化日期 下面的代码生成日期列表

import org.joda.time.LocalDate
import org.joda.time._

def getDates(startDate: String,endDate: String): Any = {
    val from = LocaDate.parse(startDate)
    val until = LocalDate.parse(endDate)
    val numberOfDays = Days.daysBetween(from,until).getDays()
    for (f<- 0 to numberOfDays) yield from.plusDays(f)
}

println(getDates("20200101","20200131"))

这将返回->向量(2020-01-01,2020-01-31)

需要将返回的Vector转换为List [String],其中元素的格式为“ yyyyMMdd”

预期输出:列表(20200101,....,20200131)

解决方法

如果getDates()输入是2个字符串,而期望的输出是List[String],那么我真的看不到有任何理由使用旧的和过时的Joda Time库。 java.time库是较新的并且功能齐全。

它还提供了datesUntil()方法,该方法几乎可以完成您想要的任何事情,除了它返回一个java.util.stream.Stream之外,这很痛苦,因为从Java Stream过渡升级至Scala List取决于您所运行的Scala版本。

例如,在Scala 2.13.x中,您可能会这样做:

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import scala.jdk.StreamConverters.StreamHasToScala

def getDates(startDate:String,endDate:String):List[String] = {
  val pattern = DateTimeFormatter.ofPattern("yyyyMMdd")
  LocalDate.parse(startDate,pattern)
           .datesUntil(LocalDate.parse(endDate,pattern).plusDays(1))
           .toScala(List)
           .map(_.format(pattern))
}

您会注意到,没有检查有效的输入格式,因此这只是用于演示,而不是可用于生产的代码。