Java8 时间处理类的使用实践(LocalDate...)

有了它,谁还在用Date?Calendar?

其实也不能这么绝对,毕竟还没到那个程度上。Java8 新增了处理时间的一组类(LocalDate、LocalDateTime、LocalTime),刚开始使用时觉得非常费劲,没有Calendar好用,但是真的使用之后觉得还是比较好用的啊。建议大家以后多多使用。废话少说,看代码~

1、Date与LocalDate的互转

Date转LocalDate:

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate 转 Date:

LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.toInstant(ZoneOffset.UTC))

显然,LocalDate和Date之间使用了Instant来转换类型,也可以使用其他的方式来转换。LocalDate.of()等等,稍微复杂的狠呢!

2、LocalDate的一些时间操作

 1 DateTimeFormatter ymd = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 2 //字符串转换成LocalDate类型
 3 LocalDate ld = LocalDate.parse("2015-11-23", ymd);
 4 System.out.println("年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
 5 System.ouot.println("从1970年1月1日开始的总天数:"+ld.toEpochDay());
 6 ld = LocalDate.of(2015,11,25);
 7 System.out.println("新年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
 8
 9 ld = ld.plusDays(1);
10 System.out.println("加一天年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
11
12 ld = ld.minusDays(2);
13 System.out.println("减两天年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
14
15 ld = ld.plusMonths(1);
16 System.out.println("加一个月年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
17
18 ld = ld.minusMonths(1);
19 System.out.println("减一个月年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
20
21 ld.plusWeeks(1);//加一星期
22 ld.plusYears(1);//加一年
23 ld.minusWeeks(1);//减一星期
24 ld.minusYears(1);//减一年

强大到我们不用去手工的计算这些东西,省事,省力,灵活性很强。

3、部分框架的支持

因为项目是Spring4+MyBatis3的,所以我只测试了这两个框架对它的支持性。

(1)Spring4 是支持LocalDate的。在spring mvc接收参数时做下格式转换:

1 @RequestMapping("/test")
2 public void method(HttpServletRequest request,HttpServletResponse response,
3 @DateTimeFormat(pattern="yyyy-MM-dd") LocalDate localDate){
4 //接收处理逻辑
5 }

对于Spring MVC的接收参数还需要说明:如果是传入的Date类型,也需要使用注解@DateTimeFormat进行格式化,不然会报400参数错误。如果是bean对象,而且含有Date或者LocalDate类型字段,也需要添加注解@DateTimeFormat。

(2)MyBatis3 对LocalDate的支持。现阶段还是不支持的,需要我们做些处理。

方案一、修改MyBatis包源码。不到迫不得已的情况下,是不会尝试的。

方案二、增加一个Handler处理类型转换。网上找到的处理方案,亲试,完全可以。

此处只介绍方案二,大牛可以去尝试下方案一。

第一步:创建转换器

 1 package com.hfms.mybatis.type;
 2
 3 import java.sql.CallableStatement;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Timestamp;
 8 import java.time.LocalDateTime;
 9
10 import org.apache.ibatis.type.BaseTypeHandler;
11 import org.apache.ibatis.type.JdbcType;
12 import org.apache.ibatis.type.MappedTypes;
13  /**
14   *类型转换器,以LocalDateTime为例,使用LocalDate需做相应修改
15   *
16   **/
17 @MappedTypes(LocalDateTime.class)
18 public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
19
20     @Override
21     public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
22         ps.setTimestamp(i, Timestamp.valueOf(parameter));
23     }
24
25     @Override
26     public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
27         Timestamp date = rs.getTimestamp(columnName);
28         if (date == null) {
29             return null;
30         } else {
31             return date.toLocalDateTime();
32         }
33     }
34
35     @Override
36     public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
37         Timestamp date = rs.getTimestamp(columnIndex);
38         if (date == null) {
39             return null;
40         } else {
41             return date.toLocalDateTime();
42         }
43     }
44
45     @Override
46     public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
47         Timestamp date = cs.getTimestamp(columnIndex);
48         if (date == null) {
49             return null;
50         } else {
51             return date.toLocalDateTime();
52         }
53     }
54 }

第二步:在mybatis-config.xml中配置

1 <typeHandlers>
2     <package name="com.hfms.mybatis.type"/>
3 </typeHandlers>

第三步:创建对象的时候使用:

1 public class Test{
2   LocalDateTime localDateTime;
3 }

这样在TestHandler.xml中就可以直接使用了。

未完待续~~

时间: 2024-08-24 19:26:44

Java8 时间处理类的使用实践(LocalDate...)的相关文章

Java8 时间日期类操作

Java8 时间日期类操作 Java8的时间类有两个重要的特性 线程安全 不可变类,返回的都是新的对象 显然,该特性解决了原来java.util.Date类与SimpleDateFormat线程不安全的问题.同时Java8的时间类提供了诸多内置方法,方便了对时间进行相应的操作. 上图为Java8时间类的覆盖范围 相关的类有 LocalDate LocalTime LocalDateTime ZoneId ZonedDateTime Instant Instant类 Instant类用来表示格林威

Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总结 0.前言 通过前面Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中主要的类关系简图如下: 可以看出主要的LocalDate, LocalTime, LocalDateTime, Instant都是实现相同的接口,这里以LocalDate为例分析jav

Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用java新的日期时间API重写农历LunarDate. package com.xkzhangsan.time; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import ja

java8 时间使用

为什么需要新的时间API 文章来源:https://www.cnblogs.com/guozp/p/10342775.html 在Java 8之前的日期/时间API之前,现有的与日期和时间相关的类存在诸多问题,其中主要有: Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义 java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理.另外

Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date).时间(Time).日期时间(DateTime).时间戳(unix timestamp)以及时区定义了不同的类. 不同时间分解成了各个类,比如:LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMo

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date

从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date.下面是时间类互相转换大全,包含Instant.LocalDate.LocalDateTime.LocalTime和Date的相互转换,下面是一个工具类,仅供参考: package com.xkzhangsan.time.converter; import java.time.Instant;

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneId. ZonedDateTime是用来处理时区相关的时间,它的各种计算都离不开ZoneId.先看ZoneId. 1. ZoneId 为时区ID,比如Europe/Paris,表示欧洲巴黎时区 1.1 时区相关知识,时区,UTC时间,GMT时间,Unix时间戳 时区 地球自西向东旋转,东边比西边先看到

日期时间处理类

java.util.Date类,默认格式:Thu Feb 25 21:32:59 CST 2016,“星期 月份 日期 时间 中国标准时间 年份” 的格式不是很友好. java.text.SimpleDateFormate类:格式化时间的类,用法如下:----------------------------------按格式输出时间 Date d=new Date();  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss