初识javaDate与字符串

来源:互联网 发布:河北秦淮数据有限公司 编辑:程序博客网 时间:2024/05/21 06:40


今天天气不错


有个任务:有若干订单的订单服务开始和结束时间,给出所有已占用的时间段的起止时间;就是时间段取并集

时间类型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 = fmt2.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));

}

}

}


忘了说了,TimeDuration是这样的结构:

public class TimeDuration {

@DateTimeFormat(pattern ="yyyy-MM-dd HH:mm:ss")

private DateorderStartTime;

@DateTimeFormat(pattern ="yyyy-MM-dd HH:mm:ss")

private DateorderEndTime;

public Date getOrderStartTime() {

returnorderStartTime;

}

public void setOrderStartTime(DateorderStartTime) {

this.orderStartTime =orderStartTime;

}

public Date getOrderEndTime() {

returnorderEndTime;

}

public void setOrderEndTime(DateorderEndTime) {

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>,把每一个元素,插入到剩下的元素中去,防止新插入的节点,将某两段时间连接了起来嘛~


好啦,就是这么个思路~ 很简单哟~



引申任务:计算事件的时间分布情况,即某个时间段事情的发生频率

差不多嘛,开动脑筋想一想,啦啦啦

希望这篇毫无逻辑的“想哪说哪”文章不要被任何人看到。。。。。。