Java中的时间类型处理

在Java中,时间类型的应用一直叫我脑壳疼。
在计算(比较时间的先后、某一个时间节点的前后时间推算,如“最近一个周一是在几月几号”),这样的问题,对于计算机(或者说代码)来说,时间的计算就是以Unix元年开始的相对时间长度。Unix元年好比[数轴]上的[原点]。
而对于用户(people)来说,当然是希望能够看到类似于“2019-09-26”或者是“2019-09-26 08:08:08”这样的东西。
矛盾点一:最终的显示字符与程序中用于计算的变量不一致(不想int类型,可以用于计算,可用于直接打印显示);
对于认真的程序员来说,日期(Date)与时间(Time)是不一样的,就是“2019-09-26”与“2019-09-26 08:08:08”的差异。当然在任何系统中,它们的存储类型和业务场景中代表的意义是不同的。员外我的生日就没法精确到小时,更别说分钟了(只是一个月黑风高夜)。
矛盾点二:精确度的要求;
那么到目前为止,大部分人使用过的,并且仍然在使用的日期(时间)java.util.Date,就让员外脑壳很疼。因为它就存在以上两个矛盾点。
幸运的是,Java8开始,java.time的引入。LocalDate、LocalTime、LocalDateTime一些类型的引入。业务中具体需要使用的类型可以找到具体的java类型(如果还有啥纠结magic,那可能是因为产品或者业务人员对某个时间、日期字段的定位不准)。

以下是几个能经常用到的类型喽:
LocalDate:简单的日期,并不含当天的时间信息。也不附带任何时区相关的信息。包含:年月日信息。

LocalDate date = LocalDate.of(2019,9,25); //参数类型(int,int,int)
LocalDate today = LocalDate.now();//default时区,当前日期

LocalTime:时分秒。

LocalTime time = LocalTime(11,6,50);//11:06:50
LocalTime nowTime = LocalTime.now();//当前时钟时间

LocalDate和LocalTime支持字符串做为参数实例化:

LocalDate date = LocalDate("2019-09-25");
LocalTime time = LocalTime("11:06:50");

LocalDateTime:LocalDate和LocalTime的合体,同时表示了日期和时间,但是不带时区信息。可以直接创建,也可以通过合并
日期和时间对象构造。

LocalDateTime t1 = LocalDateTime.of(2019,Month.September,25,11,6,50);//2019-09-25 11:06:50
LocalDateTime t2 = date.atTime(time);//date append time 返回 LocalDateTime
LocalDateTime t3 = time.atDate(date);//date append time 返回 LocalDateTime

ZoneDateTime:代表了相对于指定时区的时间点

ZoneId romeZone = ZoneId.of("Asia/Shanghai");
ZoneDateTime d1 = date.atStartOfDay(romeZone);
ZoneDateTime d2 = t1.atZone(romeZone);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章