如果使用 Salesforce 的 addMonths(1)
方法,將 1月30日 或 1月31日 加一個月,都會得到 2月28日(或 2月29日,如果是閏年)。這是因為 Salesforce 的 addMonths
方法在跨月份時會自動調整日期,確保結果是有效日期。
這可能會導致一些定時任務重復觸發,因為多個日期映射后都是同一個日期。因此更建議用 addDays 方法
示例代碼
對 Date
對象:
Date jan30 = Date.newInstance(2023, 1, 30); // 非閏年
Date jan31 = Date.newInstance(2023, 1, 31);Date feb30 = jan30.addMonths(1); // 加一個月
Date feb31 = jan31.addMonths(1); // 加一個月System.debug('Jan 30 + 1 month: ' + feb30); // 輸出:2023-02-28
System.debug('Jan 31 + 1 month: ' + feb31); // 輸出:2023-02-28
對 Datetime
對象:
Datetime jan30Time = Datetime.newInstance(2023, 1, 30, 10, 0, 0);
Datetime jan31Time = Datetime.newInstance(2023, 1, 31, 10, 0, 0);Datetime feb30Time = jan30Time.addMonths(1);
Datetime feb31Time = jan31Time.addMonths(1);System.debug('Jan 30 Datetime + 1 month: ' + feb30Time); // 輸出:2023-02-28 10:00:00
System.debug('Jan 31 Datetime + 1 month: ' + feb31Time); // 輸出:2023-02-28 10:00:00
原因
-
跨月份時的日期修正邏輯:
addMonths
方法在跨月份時,會確保返回的日期是目標月份的有效日期。- 如果目標月份中沒有與源日期相同的日期,例如 2月沒有30日或31日,則日期會調整為該月份的最后一天。
-
閏年處理:
- 如果目標月份是 閏年的2月(2024年2月有29天),則結果會是 2月29日:
Date jan31LeapYear = Date.newInstance(2024, 1, 31); Date febLeapYear = jan31LeapYear.addMonths(1); System.debug('Jan 31, 2024 + 1 month: ' + febLeapYear); // 輸出:2024-02-29
- 如果目標月份是 閏年的2月(2024年2月有29天),則結果會是 2月29日:
總結
- 1月30日 和 1月31日 加一個月,結果會是 2月28日 或 2月29日,取決于目標年份是否是閏年。
- 這種調整是 Salesforce 中的預期行為,確保日期始終有效并符合日歷規則。
如果需要處理特定場景(例如固定加30天而不是按月計算),可以使用 addDays()
方法進一步調整。