我们需要在Groovy中找到两个日期之间的天数,并删除美国政府假日。类似于这个问题,有不同的皱纹。
我们试图集思广益,找出在Groovy中存储日期的最佳方式,因为某些日期是固定的(新年、7月4日、圣诞节),而其他日期是灵活的(总统节是2月的第三个星期一)。如果其中包含任何美国政府假日,请检查日期。
您可以创建一个带有政府假日的域类。
class GHolidays {
Date date
String description
}
在控制器中创建一种方法来获得两个日期之间的天数,并删除政府假日
class ExampleController {
def daysGH = GHolidays.createCriteria().get{
projections {
count("id")
}
between("date", date1, date2)
}
use(groovy.time.TimeCategory) {
def duration = date1 - date2
def daysWithoutGH = duration.days - daysGH
println "Days without Government holidays: ${daysWithoutGH}"
}
}
下面这样的东西就可以了。
enum US2015holidays {
New_Years_Day('01/01'),
Martin_Luther_King_Day('01/19'),
Groundhog_Day('02/02', false),
Presidents_Day('02/16'),
Emancipation_Day('04/16', false),
Mothers_Day('05/10'),
Memorial_Day('05/25'),
Fathers_Day('06/21', false),
Independence_Day('07/03'),
Labor_Day('09/07'),
Columbus_Day('10/12'),
Veterans_Day('11/11'),
Thanksgiving('11/26'),
Day_after_Thanksgiving('11/27'),
Christmas_Day('12/25')
private final Date holiday
private final boolean isObserved
US2015holidays(String day, boolean isObserved = true) {
this.holiday = Date.parse('yyyy/MM/dd', "2015/$day")
}
public Date getHoliday() {
isObserved ? holiday : null
}
}
import static java.util.Calendar.*
def noOfWorkingDays = 0
Date begin = Date.parse('yyyy/MM/dd', '2015/01/01')
Date end = Date.parse('yyyy/MM/dd', '2015/04/11')
begin.upto( end ) {
if ( !( it[DAY_OF_WEEK] in [ SUNDAY, SATURDAY ] ||
it.clearTime() in US2015holidays.values()*.holiday ) ) {
noOfWorkingDays++
}
}
println noOfWorkingDays
注意:假期可能因地理位置而异。例如:在俄亥俄州哥伦布市可以观察到耶稣受难日,但我在其他地方没有看到过。