使用 groovy 根据条件选择特定范围内的日期

Selecting a date between certain range based on conditions using groovy

下面的日期生成器代码有点问题。下面的代码列表是为了确保 运行dom 日期在夏季(5 月、6 月、7 月、8 月)内 selected 可用。

所以我所做的是,如果当前月份小于 5(小于 5 月),那么 select 一个 运行dom 日期介于今年 5 月 1 日到今年 8 月 31 日之间year,否则如果当前月份超过 7(过去的 7 月),那么 select 明年 5 月 1 日到明年 8 月 31 日之间的 运行dom 日期。

现在我注意到我的代码中有一个小故障,我需要帮助。由于我 运行 今天(5 月 8 日)下面的代码,运行dom 生成器 select 的日期可能在今天的日期之前的 5 月。实际上,问题是我在这几个月里没有任何事情要处理。所以我想我需要一点重构。

我想要的是它检查当前日期,如果它在 5 月到 7 月之间(因此不少于 5 月或多于 7 月),然后检查今天的日期并选择今天到 8 月 31 日之间的日期年.

我的大脑被炸了,出于某种原因运行我正在努力寻找逻辑上有意义的东西,但我只是在编程时遇到了问题。

import groovy.time.TimeCategory

//def dataSet = testRunner.testCase.getTestStepByName("Properties")
// Select the current test data line

def dateFormat = 'yyyy-MM-dd'

def getNumberInRange = { min, max -> new Random().nextInt(max + 1 - min) + min }

def isTodayBeforeMay = { Calendar.MONTH < 5 }

def isTodayAfterJuly = { Calendar.MONTH > 7 }

//Get the number of days between today and given date
def getDifferenceDays = { targetDate, closure ->
    def strDate = closure (targetDate)
    def futureDate = new Date().parse(dateFormat, strDate)
    TimeCategory.minus(futureDate, new Date()).days
}

//Get the offset between today and max date i.e.,31 august
def getOffSetDays = { date ->
    //Need to change the date range if needed.
    //As per OP, May to August is mentioned below
    def max = getDifferenceDays(date) { "${it[Calendar.YEAR]}-08-31" }
    def min = getDifferenceDays(date) { "${it[Calendar.YEAR]}-05-01" }
    getNumberInRange(min, max)

}



def now = new Date()
def nextYearNow = now.updated(year: now[Calendar.YEAR] + 1)

def selected
def finalDate

log.info "Today : $now"
log.info "Next year same date : $nextYearNow"

if (isTodayBeforeMay()) {
    selected = now    
} else if (isTodayAfterJuly()) {
    selected = nextYearNow
} else {
    throw new Error("Not implemented for the days between 1st May to 30th July")
}

def offset = getOffSetDays(selected)

//Add the offset days to now
use(TimeCategory) {
    finalDate = now + offset.days
}

您只需要实现下面的 else 条件而不是 throw new Error(..)(问题的代码摘录):

如果您阅读代码,crystal 清除每个条件和错误消息作为下面 未知数据范围 的占位符,这是您现在想要的待处理。

if (isTodayBeforeMay()) {
    selected = now    
} else if (isTodayAfterJuly()) {
    selected = nextYearNow
} else {
    throw new Error("Not implemented for the days between 1st May to 30th July")
}

只需在最后的 else 中添加以下语句代替 threw new Error

selected = getOffSetDays(now)

编辑:

您可以在线快速试用Demo

编辑 2:看起来上面的内容有时无法正常工作,因此更新答案:

import groovy.time.TimeCategory

def dateFormat = 'yyyy-MM-dd'

def getNumberInRange = { max, min = 1 -> new Random().nextInt(max + 1 - min) + min }

def isTodayBeforeMay = { Calendar.MONTH < 5 }

def isTodayAfterJune = { Calendar.MONTH > 6 }

//Get the number of days between today and given date
def getDifferenceDays = { targetDate, closure ->
    def strDate = closure (targetDate)
    def futureDate = new Date().parse(dateFormat, strDate)
    TimeCategory.minus(futureDate, new Date()).days
}

def getPaddedString = { num, len = 2, padwith = '0' ->
    num.toString().padLeft(len, padwith)
}

//Get the offset between today and max date i.e.,31 august
def getOffSetDays = { date, minMonth = 5, minDay = 1 ->
    //Need to change the date range if needed.
    //As per OP, May to August is mentioned below
    def max = getDifferenceDays(date) { "${it[Calendar.YEAR]}-08-31" }
    def min = getDifferenceDays(date) { "${it[Calendar.YEAR]}-${getPaddedString(minMonth)}-${getPaddedString(minDay)}" }
    getNumberInRange(max, min)
}


def now = new Date()
def nextYearNow = now.updated(year: now[Calendar.YEAR] + 1)

def selected
def finalDate

println "Today : $now"
println "Next year same date : $nextYearNow"

if (isTodayBeforeMay()) {
    selected = now    
} else if (isTodayAfterJune()) {
    selected = nextYearNow
} 

def dayz = getNumberInRange(getDifferenceDays(now) { "${it[Calendar.YEAR]}-08-31" })
def offset = selected ? getOffSetDays(selected) : dayz 
offset = offset > 0 ? offset : now[Calendar.DAY_OF_MONTH]+1

//Add the offset days to now
use(TimeCategory) {
    finalDate = now + offset.days
}
println "Final future date is : $finalDate"
println "Final future date is(formatted) : ${finalDate.format(dateFormat)}"

assert now <= finalDate 

这个Demo生成日期1000次只是为了确保日期没问题。