例子
交货时间为15分钟
时间表
周一至周五:7:30 - 17:00;周六:9:00 - 14:00。
周六:9:00 - 14:00
星期日 10:00 - 13:00
如果我的初始日期(IniDate)是周一6:00,到期日将是周一7:45,如果我的IniDate是周一8:00,我的到期日将是周一8:15,但如果我的IniDate是周一16:50,我的到期日将是周二7:35,因为我有10分钟从周一和5分钟从第二天,也如果我的IniDate是周一18。 00,我的到期日将是星期二7:45,在Talend Open Studio的java中工作,用于数据集成,这将使用实际的日期,也就是说,让我们说我的IniDate是05052020 18:00,那么我的到期日将是06052020 7:45,考虑到时间表,这是我的第一个问题,试图在中间的变量部分的tMap组件中使用它,谢谢。
将您的到期时间表示为 Duration
.
Duration dueTime = Duration.ofMinutes(15);
将您的日程安排表示为 EnumMap<DayOfWeek, DailySchedule>
哪儿 DailySchedule
是你写的一个类,用于每天的开闭时间。在这个类里面,将时间表示为 LocalTime
对象。该类可能会有一些方法用于确定一天中的某一时间是在日程间隔之前、之内还是之后。
最好将您的初始时间05052020 18:00表示为一个 ZonedDateTime
在相关时区(LocalDateTime
可能也可以,但真的不适合这个目的)。)
给定你的初始日期和时间,把星期几去掉。在地图中查找每天的时间表。如果时间不在时间表区间内,先根据情况调整到今天或明天的区间开始。
第一枪你的到期日期和时间就是调整后的日期和时间加上到期时间。ZonedDateTime
有一个 plus
方法,接受一个 Duration
. 现在,如果到期日在下一个日期或在今天的截止时间之后,这是不正确的。在这种情况下,使用 Duration.between
用来计算您每天可以花费多少时间(您的例子中的10分钟)。从到期时间中减去这个时间 (Duration.minus()
). 现在从第二天的开盘时间开始进行。检查的时候真的要循环进行,要考虑到每天的时间安排可能比到期时间短。如果周六的时间表是09:00-09:05,周日是10:00-10:05,我们可能要从周五一直循环到周一才找到合适的到期日和时间。
Duration
, DayOfWeek
, LocalTime
和 ZonedDateTime
都属于java.time,现代Java日期和时间API。教程链接在底部。
祝你编码愉快。
我可能会这样做。
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
如果到期时间足够长,从一天结束到第二天开盘,这段代码将无法工作。而且各种验证和检查缺一不可,你要添加。
甲骨文教程。日期时间 解释如何使用java.time。