假設我有今天、第二天和前一天。我想撰寫一個方法,通過對它們進行邏輯運算來找到當月的第一個作業日。比如2021年11月的第一個作業日從4號開始,因為這個月的3號因為節假日沒有作業日。簡而言之,我們需要撰寫一個程式,將非作業日考慮在內,并找出每個月的第一個作業日。
uj5u.com熱心網友回復:
好吧,沒有標準的 Java 庫來獲取假期的日期。這太本地化了,因為假期在很大程度上取決于您所在的國家和地區(圣誕節或復活節等廣為人知的假期除外)。
您必須依賴一些外部資源,例如假日 API。一旦有了假期,您就可以輕松獲得一個月的第一個作業日。
在下面的代碼中,我將假期硬編碼為 a Setof LocalDates。我還假設作業日是從星期一到星期五。
public static Optional<LocalDate> firstBusinessDayOfMonth(YearMonth month) {
// I've hardcoded the holidays as LocalDates
// and put them in a Set
final Set<LocalDate> holidays = Set.of(
LocalDate.of(2021, 11, 1),
LocalDate.of(2021, 11, 2),
LocalDate.of(2021, 11, 3)
);
// For the sake of efficiency, I also put the business days into a Set.
// In general, a Set has a better lookup speed than a List.
final Set<DayOfWeek> businessDays = EnumSet.of(
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
);
return
// All dates of the month
month.atDay(1).datesUntil(month.plusMonths(1).atDay(1))
// Retain all business days. Use static imports from
// java.time.DayOfWeek.*
.filter(date -> businessDays.contains(date.getDayOfWeek()))
// Retain only dates not present in our holidays list
.filter(date -> !holidays.contains(date))
// Get the first
.findFirst();
}
要獲取當月的第一個作業日,請使用firstBusinessDayOfMonth(YearMonth.now())。
請注意,此方法回傳Optional,因為理論上可能會出現整月內沒有作業日的情況。
uj5u.com熱心網友回復:
感謝所有的答案和幫助,但這就是我想要的。
在這里,在我的 isOperateDay 變數中,他們說他們已經從另一臺服務器發送給我的資料是 1 個作業日,而不是 0 個作業日。我只想做的是檢查昨天和今天之間的值是否是第一個作業日。如您所見,我將昨天的月份與今天的月份進行比較,如果昨天的月份不同,則表示它是上個月,而我當天的月份被視為第一個作業日。
@Data
class ST_XF_DWH {
private LocalDateTime previousDate;
private LocalDateTime currentDate;
private int isOperateDate;
}
public void isFirstWorkDay(ST_XF_DWH st_xf_dwh) {
LocalDateTime previousDate = st_xf_dwh.getPreviousDate();
LocalDateTime currentDate = st_xf_dwh.getCurrentDate();
if (previousDate.getMonth() != currentDate.getMonth() && st_xf_dwh.getIsOperateDate() == 1) {
System.out.println("Is First Work Day" st_xf_dwh.getCurrentDate());
} else {
System.out.println(st_xf_dwh.getCurrentDate() "is not First Work Day");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/350571.html
上一篇:正確讀取日期/時間值
