获取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()
即可生成输出。