Salesforce 中的 SLA 到期日期计算

SLA expiration date calculation in Salesforce

提问人:Michelle Soto 提问时间:9/16/2023 最后编辑:Mark RotteveelMichelle Soto 更新时间:9/16/2023 访问量:56

问:

如何创建 Apex 代码,以计算周一至周五上午 8 点至下午 6 点以及周六上午 8 点至下午 1 点 72 小时服务的确切日期/时间,同时考虑到假期并使用初始日期作为基础?换句话说,我需要为该方法提供开始日期和服务时间,以便它可以计算最终日期。

我将提供两个示例:

我的初始日期/时间是 01/09/2023 08:00 am,我的服务时间是 8,所以我的最终日期应该是 01/09/2023 04:00 pm。

我的初始日期/时间是 01/09/2023 08:00:00,我的服务时间是 12,所以我的最终日期应该是 02/09/2023 10:00:00。在此示例中,由于我的日程安排是从周一至周五上午 8 点到下午 6 点,因此它会跳到第 2 天,因为在第 1 天下午 6 点之后,它直到第二天才计算在内,从早上 8 点开始。

我尝试了以下代码,但它没有给我预期的结果。

public class DateTimeCalculator {

    // Method to calculate the final date/time
    public static Datetime calculateFinalDatetime(Datetime initialDatetime, Integer serviceHours) {
        Integer dailyWorkHours = 8;
        Datetime finalDatetime = initialDatetime;
        List<Date> holidays = new List<Date>{Date.newInstance(2023, 9, 4)}; // List of holidays
        
        while (serviceHours > 0) {
            if (isWorkingDay(finalDatetime)) {
                Integer hoursUntilEndOfDay = (finalDatetime.addHours(18).getTime() - finalDatetime.getTime()) / 3600000;
                if (serviceHours <= hoursUntilEndOfDay) {
                    finalDatetime = finalDatetime.addHours(serviceHours);
                    serviceHours = 0;
                } else {
                    finalDatetime = finalDatetime.addHours(16); // Adjust to 8 am of the next day
                    finalDatetime = finalDatetime.addDays(1);
                    serviceHours -= hoursUntilEndOfDay;
                }
            } else {
                finalDatetime = finalDatetime.addHours(16); // Adjust to 8 am of the next day
                finalDatetime = finalDatetime.addDays(1);
            }
        }
        
        return finalDatetime;
    }

    // Method to check if a day is a working day
    private static Boolean isWorkingDay(Datetime day) {
        // Define working days (Monday to Friday) and Saturdays
        return (day.format('E') != 'Sat' && day.format('E') != 'Sun') ||
               (day.format('E') == 'Sat' && day.hour() >= 8 && day.hour() < 13);
    }
}
Java 日期时间 Salesforce 计算器 Apex

评论


答:

0赞 eyescream 9/16/2023 #1

有一种更好的方法,内置方法可以进行此计算,包括周末、节假日、夏令时......

转到设置 - > 工作时间。配置您的开放时间和几个公共假期。然后阅读有关 https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_classes_businesshours.htm 的信息或搜索有关它的问题,例如 https://stackoverflow.com/a/69723001/313628https://stackoverflow.com/a/75553533/313628

评论

0赞 Michelle Soto 9/20/2023
感谢您提供的信息,它可以解决问题。