Groovy方法在星期几之前查找范围内的日期

时间:2016-09-14 02:55:42

标签: groovy jodatime

完成Joda Time示例的Groovy方法是什么:

app/vendor/bundle/gems/bootstrap-sass-3.3.5/assets/stylesheets/.

一周超过1天的情况:星期一和星期二,例如

1 个答案:

答案 0 :(得分:1)

根据您的开始和结束日期参数,使用以下Groovy代码(使用Groovy Date.parse()Date.format()混合函数,Groovy Date + int添加,Groovy String到{ {1}}强制,以及一些代数)似乎可以解决这个问题:

int

话虽如此,底部的Date startDate = Date.parse("yyyy-MM-dd","2016-11-08") Date endDate = Date.parse("yyyy-MM-dd","2017-05-01") Date mondayStart = startDate + 6 - ((5 + (startDate.format("u") as int)) % 7) while (mondayStart < endDate) { println mondayStart mondayStart += 7 } 循环有点......“开放式”。您可以使用Groovy的while文字语法和Range混合函数获得更具分析性的等价物。以下内容仅替换 上面的List.step()循环:

while

第2部分:超过星期一

为了与一周中的其他日子一起工作,我们需要使用基于星期几的合适子表达式替换(mondayStart..<endDate).step(7) { stepDate -> println stepDate } 作业中的常量5。幸运的是,以下表达式非常有效:

mondayStart

将整个事物放在一起并按摩一下,它看起来像这样:

7 - Calendar."${weekDay.toUpperCase()}"

定义了该函数,以下测试代码:

def weekDaysInDateRange(Date startDate, Date endDate, String weekDay = "monday") {
    startDate = startDate.clearTime()
    endDate = endDate.clearTime()
    def offset = 7 - Calendar."${weekDay.toUpperCase()}"
    def startDOW = startDate.format("u") as int
    def weekDayStartDate = startDate + 6 - (offset + startDOW) % 7

    (weekDayStartDate..<endDate).step(7) { stepDate ->
        println (stepDate.format("yyyy-MM-dd"))
    }
}

给出以下结果:

def now = new Date()
def nextMonthIsh = new Date() + 30
println "$now --> $nextMonthIsh"
println "============================================================="

["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]
.each { weekDay ->
    println """
$weekDay
=========="""
    weekDaysInDateRange(now, nextMonthIsh, weekDay)
}