使用 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次只是为了确保日期没问题。
下面的日期生成器代码有点问题。下面的代码列表是为了确保 运行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次只是为了确保日期没问题。