本文介紹了考慮到從初始日期開(kāi)始的工作計(jì)劃,我如何生成到期日?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
示例
到期時(shí)間為15分鐘
日程安排
周一至周五:7:30-17:00
星期六9:00-14:00
周日10:00-13:00
如果我的初始日期(IniDate)是星期一的6:00,那么截止日期就是星期一的7:45
如果我的INDate是星期一的8:00,我的預(yù)產(chǎn)期是星期一的8:15,但是如果我的INDate是星期一的16:50,我的預(yù)產(chǎn)期是星期二的7:35,因?yàn)槲译x星期一有10分鐘,離第二天有5分鐘,另外,如果我的INDate是星期一的18:00,我的預(yù)產(chǎn)期是星期二的7:45,在Talend Open Studio中使用Java進(jìn)行數(shù)據(jù)集成,這將使用實(shí)際日期。這意味著假設(shè)我的初始日期是2020年5月5日18:00,那么我的預(yù)產(chǎn)期將是2020年6月5日7:45,考慮到時(shí)間表,這是我的第一個(gè)問(wèn)題,嘗試在中間變量部分的TMap組件中使用它。
推薦答案
將您的到期時(shí)間表示為Duration
:
Duration dueTime = Duration.ofMinutes(15);
將您的日程表表示為EnumMap<DayOfWeek, DailySchedule>
,其中DailySchedule
是您為每天的開(kāi)放和關(guān)閉時(shí)間編寫(xiě)的類(lèi)。在類(lèi)內(nèi)部將時(shí)間表示為LocalTime
對(duì)象。該類(lèi)可能具有用于確定給定時(shí)間是在計(jì)劃間隔之前、之內(nèi)還是之后的方法。
最好將您的初始時(shí)間05/05/2020 18:00表示為相關(guān)時(shí)區(qū)的ZonedDateTime
(LocalDateTime
可能也可以,但確實(shí)不適合此目的)。
給出你最初的日期和時(shí)間,去掉星期幾。在地圖上查一查日程表。如果時(shí)間不在計(jì)劃間隔內(nèi),請(qǐng)首先根據(jù)需要將其調(diào)整為今天或明天的間隔開(kāi)始時(shí)間。
在您的到期日期和時(shí)間中的第一個(gè)快照是調(diào)整后的日期和時(shí)間加上到期時(shí)間。ZonedDateTime
具有接受Duration
的plus
方法。現(xiàn)在,如果到期日期在下一個(gè)日期或在今天的關(guān)閉時(shí)間之后,這是不正確的。在本例中,使用Duration.between
計(jì)算一天可以花費(fèi)多少時(shí)間(示例中的10分鐘)。從到期時(shí)間(Duration.minus()
)中減去此值。現(xiàn)在從第二天的開(kāi)放時(shí)間開(kāi)始。檢查真的應(yīng)該在循環(huán)中進(jìn)行,以考慮到每天的時(shí)間表可能比預(yù)期時(shí)間短。如果周六的日程安排為09:00-09:05,周日的日程安排為10:00-10:05,我們可能不得不從周五循環(huán)到周一,然后才能找到正確的截止日期和時(shí)間。
Duration
、DayOfWeek
、LocalTime
和ZonedDateTime
都屬于現(xiàn)代Java日期和時(shí)間API java.time。位于底部的教程鏈接。
稍后編輯:代碼
我可能會(huì)這樣做:
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);
示例的輸出:
截止日期和時(shí)間:星期二07:35
如果到期時(shí)間足夠長(zhǎng),從一天關(guān)閉到第二天打開(kāi),代碼將不起作用。并且缺少各種驗(yàn)證和檢查,您將需要添加它們。
鏈接
Oracle tutorial: Date Time解釋如何使用java.time。
這篇關(guān)于考慮到從初始日期開(kāi)始的工作計(jì)劃,我如何生成到期日?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,