今天天气不错
有个任务:有若干订单的订单服务开始和结束时间,给出所有已占用的时间段的起止时间;就是时间段取并集
时间类型Date,它有很多成员变量和方法
在某个类里定义一个Date类型的成员变量,你给它打标签:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss"),那它就以这种样子呈现在你眼前(接口中或者数据库中)。但这并不是说,它就是一个这种格式的字符串啊~~~要搞搞清楚哟,它仍然是一个Date类型的变量。你可以用Date的各种方法获取年、月、日、时、分、秒,你也可以通过它的好基友SimpleDateFormat来将它转换成其他各种格式。
比如:date转为字符串:
Date date = new Date();
SimpleTimeFormat fmt = new SimpleTimeFormat("yyyy-MM-dd");
String dateString = fmt.format(date);
记住:这里时间转String是fmt.format哟~
当然也可以用各种格式的时间字符串,以及匹配的SimpleTimeFormat的格式,将时间字符串,转换成Date
比如:
SimpleDateFormat fmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date testDate = f mt2.parse("2017-07-10 19:53:21");这个testDate就是Date啦,就是时间戳了哟~ 就是这么简单!
好了回到我今天的任务上来:
如果某天有任意时间被占用,那这天的全部时间就全部不可再使用;每个订单的起始时间会有重复~
我的做法:
先取到所有时间的日期(yyyy-MM-dd)格式,并保存到一个HashSet中,让hashSet帮我去重~
如果某个时间段是绵延很多天的,比如,10号的7点到17号的17点~
那,就要除了遍历整个时间段list之外,对每一个时间段节点,都要按天加一来再循环一次,以找出每一天的时间了~
Set<String> dateString = new HashSet<String>();
for(TimeDuration t : timeList) {
dateString.add(fmt.format(t.getOrderStartTime()));
Date tmpDate = t.getOrderStartTime();
while(tmpDate.before(t.getOrderEndTime())) {
tmpDate.setTime(tmpDate.getTime() + Constants.ONE_DAY);
if(tmpDate.before(t.getOrderEndTime())) {
dateString.add(fmt.format(tmpDate));
}
}
}
public class TimeDuration {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderStartTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date orderEndTime;
public Date getOrderStartTime() {
return orderStartTime;
}
public void setOrderStartTime(Date orderStartTime) {
this.orderStartTime = orderStartTime;
}
public Date getOrderEndTime() {
return orderEndTime;
}
public void setOrderEndTime(Date orderEndTime) {
this.orderEndTime = orderEndTime;
}
}
其实,取时间的并集,还有这样一种方法:
设已有时间段 开始时间s0,结束时间e0;待取并集的时间段开始时间s1,结束时间e1;
它们的并集就是
1. if(s1.getTime > e0.getTime || e1.getTime < s0.getTime)//就是,开始时间晚于原先的
结束时间,或者结束时间早于原先的开始时间。画个图嘛,这说明,两端时间完全没有交集,因此,并集就简单相加好了,原来的List<TimeDuration>加一个节点就好
2.只要不是第一种情况,那就说明有并集,有一块重合的时间,那就要这么处理了:
并集的开始时间:取两个开始时间的最小值,Math.min(s0.getTime(), s1.getTime())
并集的结束时间:取两个结束时间的最大值,Math.max(e0.getTime(), e1.getTime())
这种情况下,原来的List<TimeDuration>不需要增加新节点,把一个原来的节点扩充下范围就好
这样,每当有一个新的时间段来的时候,要将这个时间段和原先的List<TimeDuration>中的节点依次比较,增加一个新节点,或者扩充一个原有节点
然后,等所有新节点都处理完,递归处理这个新的List<TimeDuration>,把每一个元素,插入到剩下的元素中去,防止新插入的节点,将某两段时间连接了起来嘛~
好啦,就是这么个思路~ 很简单哟~
引申任务:计算事件的时间分布情况,即某个时间段事情的发生频率
差不多嘛,开动脑筋想一想,啦啦啦
希望这篇毫无逻辑的“想哪说哪”文章不要被任何人看到。。。。。。