获取scala中给定月份和年份的所有日期作为列表

获取scala中给定月份和年份的所有日期作为列表,scala,Scala,我已经厌倦了编写函数来获取给定月份和年份的所有日期,如下所示 def allDaysForYear(year: String , month:String): List[(String, String, String)] = { val daysInYear = if(Year.of(year.toInt).isLeap) 366 else 365 for { day <- (1 to daysInYear).toList localDate = LocalDate

我已经厌倦了编写函数来获取给定月份和年份的所有日期,如下所示

def allDaysForYear(year: String , month:String): List[(String, String, String)] = {
  val daysInYear = if(Year.of(year.toInt).isLeap) 366 else 365
  for {
    day <- (1 to daysInYear).toList
    localDate = LocalDate.ofYearDay(year.toInt, day)
    month = localDate.getMonthValue
    dayOfMonth = localDate.getDayOfMonth
  } yield (year, month.toString, dayOfMonth.toString)
}

有谁能帮上忙吗?

你很接近了。您已经有了来自
LocalDate.ofYearDay(year.toInt,day)
的日期

您只需调用
.toString
,因为yield将生成您想要的序列:

def allDaysForYear(year: Int): Seq[String] = {
  val daysInYear = if(Year.of(year).isLeap) 366 else 365
  for(day <- 1 to daysInYear) yield LocalDate.ofYearDay(year, day).toString
}
def allDaysForYear(年份:Int):Seq[String]={
val daysInYear=if(年份)(年份).isLeap)366 else 365

对于(天您很接近。您已经有了来自
LocalDate.ofYearDay(year.toInt,day)
的日期

您只需调用
.toString
,因为yield将生成您想要的序列:

def allDaysForYear(year: Int): Seq[String] = {
  val daysInYear = if(Year.of(year).isLeap) 366 else 365
  for(day <- 1 to daysInYear) yield LocalDate.ofYearDay(year, day).toString
}
def allDaysForYear(年份:Int):Seq[String]={
val daysInYear=if(年份)(年份).isLeap)366 else 365

对于(天),您可以使用java日历为您计算此日期。
看来你想把日期格式化,所以我改了签名

import java.util.Calendar
import java.text.SimpleDateFormat

val calendar = Calendar.getInstance
val formatter = new SimpleDateFormat("yyyy-MM-dd")

def allDaysForYear(year:Int, month:Int):List[String] = {
  calendar.set(year, month - 1, 1)

  (1 to calendar.getActualMaximum(Calendar.DAY_OF_MONTH)).map(_ => {
    val currentDate = calendar.getTime
    calendar.roll(Calendar.DATE, true)
    formatter.format(currentDate)
  }).toList
}

您可以使用java日历为您计算此值。
看来你想把日期格式化,所以我改了签名

import java.util.Calendar
import java.text.SimpleDateFormat

val calendar = Calendar.getInstance
val formatter = new SimpleDateFormat("yyyy-MM-dd")

def allDaysForYear(year:Int, month:Int):List[String] = {
  calendar.set(year, month - 1, 1)

  (1 to calendar.getActualMaximum(Calendar.DAY_OF_MONTH)).map(_ => {
    val currentDate = calendar.getTime
    calendar.roll(Calendar.DATE, true)
    formatter.format(currentDate)
  }).toList
}

最后,我使用了一行程序,给定一个
,它将为一年中的每一天返回一个
LocalDate
s序列

def datesInYear(year: Year) = (1 to year.length()).map(year.atDay)
由调用者创建一个
。这是这样做的
Year.of(…)


工作原理:
Year
具有负责闰年等的
length
属性(无需执行
if(leap)355 else 356
)如果我们所做的只是将一组数字映射到日期,那么也不需要进行理解。
Year\atDay
获取一个
Int
并返回一个
LocalDate
,这正是
map
调用所需的映射函数,因此无需为映射构造匿名函数(即
.map(n=>year.atDay(n))
不需要)

我最后得到了一个线性函数,给定
将返回一年中每一天的
LocalDate
序列

def datesInYear(year: Year) = (1 to year.length()).map(year.atDay)
由调用者创建一个
。这是这样做的
Year.of(…)


工作原理:
Year
具有负责闰年等的
length
属性(无需执行
if(leap)355 else 356
)如果我们所做的只是将一组数字映射到日期,那么也不需要进行理解。
Year\atDay
获取一个
Int
并返回一个
LocalDate
,这正是
map
调用所需的映射函数,因此无需为映射构造匿名函数(即
.map(n=>year.atDay(n))
不需要)

处理此问题的两种方法。下面的代码也摆脱了闰年显式处理

如果您需要一个列表输出

def allDaysForYear(year: String , month:String): List[String] = {
val daysInMonth = java.time.YearMonth.of(year.toInt,month.toInt).lengthOfMonth
    for
    {
        day <- (1 to daysInMonth ).toList
        localdate = java.time.LocalDate.of(year.toInt,month.toInt,day).toString
    } yield(localdate)
}
如果你需要一个序列

def allDaysForYear(year: String , month:String): Seq[String] = {
        val daysInMonth = java.time.YearMonth.of(year.toInt,month.toInt).lengthOfMonth
        for (day <- 1 to daysInMonth ) yield java.time.LocalDate.of(year.toInt,month.toInt,day).toString
}
如果您需要给定日期的单行输出:

假设您的日期为存储在变量dt下的格式(“YYYY-MM-DD”)或(“YYYY-MM”)

val daterange = for (day <- 1 to java.time.YearMonth.of(dt.substring(0,4).toInt,dt.substring(5,7).toInt).lengthOfMonth ) yield java.time.LocalDate.of(dt.substring(0,4).toInt,dt.substring(5,7).toInt,day).toString

下面的代码也摆脱了闰年显式处理

如果您需要一个列表输出

def allDaysForYear(year: String , month:String): List[String] = {
val daysInMonth = java.time.YearMonth.of(year.toInt,month.toInt).lengthOfMonth
    for
    {
        day <- (1 to daysInMonth ).toList
        localdate = java.time.LocalDate.of(year.toInt,month.toInt,day).toString
    } yield(localdate)
}
如果你需要一个序列

def allDaysForYear(year: String , month:String): Seq[String] = {
        val daysInMonth = java.time.YearMonth.of(year.toInt,month.toInt).lengthOfMonth
        for (day <- 1 to daysInMonth ) yield java.time.LocalDate.of(year.toInt,month.toInt,day).toString
}
如果您需要给定日期的单行输出:

假设您的日期为存储在变量dt下的格式(“YYYY-MM-DD”)或(“YYYY-MM”)

val daterange = for (day <- 1 to java.time.YearMonth.of(dt.substring(0,4).toInt,dt.substring(5,7).toInt).lengthOfMonth ) yield java.time.LocalDate.of(dt.substring(0,4).toInt,dt.substring(5,7).toInt,day).toString

虽然此代码可以回答此问题,但提供有关此代码为什么和/或如何回答此问题的附加上下文可提高其长期价值。感谢此解决方案。仅需几个小点-未使用
参数,理想情况下,年参数应为Int,以避免
.toInt
可能会放大lat呃。另外,
1到daysInYear
不会生成
列表
,因此函数的返回类型不匹配。通过一些调整,此代码确实生成了我需要的内容:-)你完全正确@PeterPerháč。这篇文章写得很匆忙。我会按照建议进行修改。虽然这段代码可能会回答这个问题,但提供有关这段代码为什么和/或如何回答这个问题的附加上下文可以提高其长期价值。感谢这一解决方案。只需几点小问题-
month
参数不使用,年份理想情况下,参数应为Int,以避免
.toInt
可能在以后爆炸。此外,
1到daysInYear
不会生成
列表,因此函数的返回类型不匹配。通过一些调整,此代码实际上会生成我需要的:-)你完全正确@PeterPerháč。写这篇文章很匆忙。我会按照建议修改。感谢你给我宝贵的时间来解决我的问题。这个答案使用了应该避免的麻烦的旧遗留日期时间类,而问题是关于现代java.time类。实际上,它没有,问题没有询问模式在rn java.time类中,它询问如何“编写函数以获取给定月份和年份的所有日期列表”。谢谢你给我宝贵的时间来解决我的问题。这个答案使用了应该避免的麻烦的旧遗留日期时间类,而问题是关于现代java.time类。实际上它没有,问题没有问现代java.time类,而是问如何“编写函数以获取给定月份和年份的所有日期列表”。您所需的输出符合ISO 8601标准格式,默认情况下在
LocalDate
toString
方法中使用。只需调用
LocalDate.toString()
生成输出。所需的输出符合ISO 8601标准格式,默认情况下在
LocalDate
toString
方法中使用。只需调用
LocalDate.toString()
即可生成输出。