如何在Groovy中查找两个日期之间的天数,删除政府假日



我们需要在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

注意:假期可能因地理位置而异。例如:在俄亥俄州哥伦布市可以观察到耶稣受难日,但我在其他地方没有看到过。

最新更新