本文介紹了考慮到從初始日期開始的工作計劃,我如何生成到期日?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
示例
到期時間為15分鐘
日程安排
周一至周五:7:30-17:00
星期六9:00-14:00
周日10:00-13:00
如果我的初始日期(IniDate)是星期一的6:00,那么截止日期就是星期一的7:45
如果我的INDate是星期一的8:00,我的預產期是星期一的8:15,但是如果我的INDate是星期一的16:50,我的預產期是星期二的7:35,因為我離星期一有10分鐘,離第二天有5分鐘,另外,如果我的INDate是星期一的18:00,我的預產期是星期二的7:45,在Talend Open Studio中使用Java進行數據集成,這將使用實際日期。這意味著假設我的初始日期是2020年5月5日18:00,那么我的預產期將是2020年6月5日7:45,考慮到時間表,這是我的第一個問題,嘗試在中間變量部分的TMap組件中使用它。
推薦答案
將您的到期時間表示為Duration
:
Duration dueTime = Duration.ofMinutes(15);
將您的日程表表示為EnumMap<DayOfWeek, DailySchedule>
,其中DailySchedule
是您為每天的開放和關閉時間編寫的類。在類內部將時間表示為LocalTime
對象。該類可能具有用于確定給定時間是在計劃間隔之前、之內還是之后的方法。
最好將您的初始時間05/05/2020 18:00表示為相關時區的ZonedDateTime
(LocalDateTime
可能也可以,但確實不適合此目的)。
給出你最初的日期和時間,去掉星期幾。在地圖上查一查日程表。如果時間不在計劃間隔內,請首先根據需要將其調整為今天或明天的間隔開始時間。
在您的到期日期和時間中的第一個快照是調整后的日期和時間加上到期時間。ZonedDateTime
具有接受Duration
的plus
方法。現在,如果到期日期在下一個日期或在今天的關閉時間之后,這是不正確的。在本例中,使用Duration.between
計算一天可以花費多少時間(示例中的10分鐘)。從到期時間(Duration.minus()
)中減去此值。現在從第二天的開放時間開始。檢查真的應該在循環中進行,以考慮到每天的時間表可能比預期時間短。如果周六的日程安排為09:00-09:05,周日的日程安排為10:00-10:05,我們可能不得不從周五循環到周一,然后才能找到正確的截止日期和時間。
Duration
、DayOfWeek
、LocalTime
和ZonedDateTime
都屬于現代Java日期和時間API java.time。位于底部的教程鏈接。
稍后編輯:代碼
我可能會這樣做:
Map<DayOfWeek, DailySchedule> weeklySchedule = new EnumMap<>(DayOfWeek.class);
DailySchedule weekdaySchedule
= new DailySchedule(LocalTime.of(7, 30), LocalTime.of(17, 0));
for (DayOfWeek dow = DayOfWeek.MONDAY;
dow.getValue() <= DayOfWeek.FRIDAY.getValue(); dow = dow.plus(1)) {
weeklySchedule.put(dow, weekdaySchedule);
}
weeklySchedule.put(DayOfWeek.SATURDAY,
new DailySchedule(LocalTime.of(9, 0), LocalTime.of(14, 0)));
weeklySchedule.put(DayOfWeek.SUNDAY,
new DailySchedule(LocalTime.of(10, 0), LocalTime.of(13, 0)));
Duration dueTime = Duration.ofMinutes(15);
// Set initial day and time
DayOfWeek currentDay = DayOfWeek.MONDAY;
LocalTime currentTime = LocalTime.of(16, 50);
Duration remainingTimeToAdd = dueTime;
DailySchedule todaysSchedule = weeklySchedule.get(currentDay);
if (todaysSchedule.isBeforeOpen(currentTime)) {
currentTime = todaysSchedule.getOpen();
} else if (todaysSchedule.isOnOrAfterClose(currentTime)) {
currentDay = currentDay.plus(1);
todaysSchedule = weeklySchedule.get(currentDay);
currentTime = todaysSchedule.getOpen();
}
// We will break this loop explicitly when done
while (true) {
// Can time be added today?
LocalTime candidateDueTime = currentTime.plus(remainingTimeToAdd);
if (todaysSchedule.isWithinSchedule(candidateDueTime)) {
// yes, done
currentTime = candidateDueTime;
break;
} else {
// take remainder of today and continue tomorrow
remainingTimeToAdd = remainingTimeToAdd.minus(Duration.between(currentTime, todaysSchedule.getClose()));
currentDay = currentDay.plus(1);
todaysSchedule = weeklySchedule.get(currentDay);
currentTime = todaysSchedule.getOpen();
}
}
System.out.println("Due day and time: " + currentDay + " at " + currentTime);
示例的輸出:
截止日期和時間:星期二07:35
如果到期時間足夠長,從一天關閉到第二天打開,代碼將不起作用。并且缺少各種驗證和檢查,您將需要添加它們。
鏈接
Oracle tutorial: Date Time解釋如何使用java.time。
這篇關于考慮到從初始日期開始的工作計劃,我如何生成到期日?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,