QWorker 中默认的工作日判定规则是周一至周五为工作日,周六和周日为休息日,大多数情况下,这没有多大的问题。但是,可但是,无论那个国家,都有自己的法定节假日,将它们放在工作日里显示是不合适的。而做为一个底层的引擎,显示不适合只根据中国的规则来写死。反过来,你也没法写死,因为像我们国家,许多法定节假日是按照农历走的,在阳历上的日期并不固定,显然这没法写死。
所以,在 QWorker 中,提供了一个全局的 IsWorkDay 变量,用于关联到用户自定义的函数来判断指定的日期是否是工作日。其默认关联到了 DefaultIsWorkDay 函数,我们要改变它的行为,只需要编写一个自己的节假日判断函数,然后在程序启动时,设置 IsWorkDay 为自己的判断函数就可以了。
这里介绍另一个东东:TQBits,你可以用它来最小化来存贮每年的休息日数据,每一位代表一天,然后 366 天存贮只需要 366 / 8 约 46 个字节(可提供368位)的大小即可。下面是一个简单的例子,其中 WorkDayMasks 是假设预存贮好的 TQBits 数组,每年对应 46 字节的工作日信息数据。
var WorkDayMasks:array[2015..2015] of TQBits; ... function MyIsWorkDay(ADate: TDateTime): Boolean; var AYear:Word; begin AYear:=YearOf(ADate); if (AYear>=Low(WorkDayMasks)) and (AYear<=High(WorkDayMasks)) then Result:=WorkDayMasks[AYear][DayOfTheYear(ADate)] else Result:=DefaultIsWorkDay(ADate); end;
然后你在调用 QWorker.Plan 时的掩码中,如果包含了 W 掩码的时候,就会通过这个函数来判定某一天是否是工作日,从而决定是否调度作业。