Maximo自动化脚本:如何计算不含周末与节假日的两日天数差?
在Maximo Jython自动化脚本中调用日历应用处理节假日计算
Great question! 我之前在Maximo项目里刚好实现过类似的需求——计算工作日差(剔除周末+自定义节假日),正好可以给你分享具体的实现思路和代码。
核心思路
Maximo的Calendar应用里的节假日数据存储在CALENDARHOLIDAY表中,关联CALENDAR表的日历记录。我们可以通过Maximo的MBO API直接查询指定日历下的所有节假日,然后在日期遍历逻辑中加入“是否为节假日”的判断,最终得到准确的工作日天数。
具体实现步骤&代码示例
1. 先准备基础工具函数
首先我们需要两个辅助函数:一个判断日期是否为周末,另一个判断是否为指定日历的节假日。
from psdi.mbo import MboConstants from psdi.util import MXDate def is_weekend(date_obj): # MXDate的getDayOfWeek()返回1=周日,2=周一...7=周六 day_of_week = date_obj.getDayOfWeek() return day_of_week == 1 or day_of_week == 7 def is_holiday(date_obj, calendar_id): # 获取指定日历的节假日集合 cal_set = mbo.getMboSet("CALENDAR", "CALENDAR") cal_set.setWhere("CALENDARID = '" + calendar_id + "'") cal_mbo = cal_set.getMbo(0) if not cal_mbo: return False # 如果日历不存在,默认无节假日 # 获取该日历下的所有节假日 holiday_set = cal_mbo.getMboSet("CALENDARHOLIDAY") holiday_set.setWhere("HOLIDAYDATE = ?", date_obj) holiday_mbo = holiday_set.getMbo(0) return holiday_mbo is not None
2. 整合到你的天数差计算逻辑中
假设你已经有了计算两日差的基础代码,现在把上面的工具函数加进去,遍历日期时跳过周末和节假日:
def calculate_work_days(start_date_str, end_date_str, calendar_id): # 转换字符串为MXDate对象(根据你的日期格式调整,比如"yyyy-MM-dd") start_date = MXDate(start_date_str) end_date = MXDate(end_date_str) if start_date.after(end_date): start_date, end_date = end_date, start_date # 确保开始日期早于结束日期 work_days = 0 current_date = start_date while current_date.before(end_date) or current_date.equals(end_date): # 既不是周末也不是节假日,才算工作日 if not is_weekend(current_date) and not is_holiday(current_date, calendar_id): work_days += 1 # 日期加1天 current_date = current_date.addDays(1) return work_days # 调用示例:假设你的节假日日历ID是"CN_PUBLIC_HOLIDAYS" # start_date和end_date替换成你的实际日期值 total_work_days = calculate_work_days("2024-01-01", "2024-01-10", "CN_PUBLIC_HOLIDAYS") mbo.setValue("WORKDAYS", total_work_days) # 把结果写到对应的字段里
注意事项
- 日历ID的确认:你需要在Maximo的Calendar应用中找到存储节假日的日历记录,获取它的
CALENDARID(比如系统默认的PRIMARY日历,或者你自定义的节假日日历)。 - 日期格式:确保你的日期字符串格式和MXDate的解析格式匹配,如果格式不同,可以用
MXDate.parse()方法指定格式,比如MXDate.parse("01/01/2024", "MM/dd/yyyy")。 - 性能优化:如果需要频繁计算,建议把节假日数据缓存起来(比如存到一个全局集合里),避免每次都查询MBO集合,提升脚本执行效率。
内容的提问来源于stack exchange,提问作者maximus_birt
相关产品推荐
相关产品推荐

