You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:35:22