[Java] LocalDate/LocalTime/LocalDateTime类的介绍与使用

背景

简要说下这几个JDK1.8中新增的日期API的背景。
早在JDK1.0时代,JDK就包含了一个与时间相关的java.util.Date类,而因为其本身的缺陷,其大多数方法都在JDK1.1时代被新引入的与时间相关的Calendar类取代。而Calendar类并不比Date类好太多,其本身也有不少问题。譬如:

  • Calendar类是可变的,即可以直接修改内部储存的时间值,而日期时间这类属性应更类似于字符串String,具有不可变性才较为合理。
  • Date的起始年份都按1900年开始计算,而Date与Calendar的月份都以0开始计算,这与人的直觉和其他属性的计算方式有冲突,我们称其为偏移量。
  • 我们知道有个SimpleDateFormat类可以对日期进行格式化操作,而这个类只能直接操作Date类,对于后来加入并取代Date类大部分方法的Calendar类并不能直接操作。
  • 上述类都不是线程安全的。

对于第二点的代码解释:

        Date date = new Date(2077,6,1); 	// Fri Jul 01 00:00:00 CST 3977
        System.out.println(date);           // 年份从1990年开始计算:偏移量,月份从0开始,表示9月应该是8

注意存储的年份并不是2077,而是1900+2077;而月份也并不是6月,而是6-1月。这种操作逻辑就与人的直觉产生了冲突。

为了解决上述问题,JDK1.8中新增了许多与时间相关的新的API:LocalDate/LocalTime/LocalDateTime就是其中三个,也是这篇文章将要介绍的三个类。

LocalDate/LocalTime/LocalDateTime类的应用

这三个类从名称上也可以看到其实用法差不太多,相较之下LocalDateTime的使用频率较高。

实例化

这三个类的构造器都被声明为private,源码:

private LocalDate(int year, int month, int dayOfMonth) {
        this.year = year;
        this.month = (short) month;
        this.day = (short) dayOfMonth;
    }

因此我们想要获取这三个类的实例化对象时,需要调用其内部的一个静态方法:now(),该方法会返回一个对应当前时间的实例化对象。

该方法除空参外还有两个重载方法,重载方法涉及到其他新增时间API,因此这里仅介绍空参方法。

        LocalDate date = LocalDate.now();
        LocalTime time = LocalTime.now();
        LocalDateTime dateTime = LocalDateTime.now();

我们可以对这三个实例化对象分别打印以下,结果如下:

        System.out.println(date);
        System.out.println(time);
        System.out.println(dateTime);/*
        2020-06-23
        09:16:56.208
        2020-06-23T09:16:56.208
        */

如上所见,三个类之间的主要区别就是所记录时间日期的范围不同。其中LocalDateTime的时间记录范围最广,应用最宽泛。因此下文中相关方法的演示为避免赘述,仅对LocalDateTime类进行演示,其余两个类用法相同。

除了now()之外还有另一种实例化方式:of(xxx) ,可以创建指定时间的实例化对象。不同于Date,该方法不必考虑偏移量。

		LocalDateTime of = LocalDateTime.of(2020, 10, 6, 13, 23, 23); // 无偏移量
        System.out.println(of);					// 2020-10-06T13:23:23

该方法有众多重载方法,根据参数名称也容易理解其区别,使用时按需要调用即可。
在这里插入图片描述

常用方法

getXxx():

在这里插入图片描述
获取相关的属性,看方法名即可清楚其作用,选取几个演示如下:

        System.out.println(dateTime.getDayOfMonth());	// 25
        System.out.println(dateTime.getDayOfWeek());	// THURSDAY
        System.out.println(dateTime.getDayOfYear());	// 177
        System.out.println(dateTime.getHour());			// 10
        System.out.println(dateTime.getMonth());		// JUNE

这个方法的使用上和Calendar类较为相似。

withXxx(xxx):在这里插入图片描述

设置相关的属性,会返回一个新的该类实例化对象的引用,从方法名称也可以看出其作用。这里区别于Calendar直接修改本身,体现了不可变性。具体看如下代码:

        LocalDateTime localDateTime = dateTime.withDayOfMonth(22);	// 在原有时间基础上,更改天数为本月第22天
        // 原对象存储的时间不改变,返回一个修改后的对象的引用
        System.out.println(dateTime);		//	2020-06-25T10:10:32.928
        System.out.println(localDateTime);	//	2020-06-22T10:10:32.928
plusXxx(xxx):在这里插入图片描述

与上述介绍的两个方法类似,看方法名知作用,在原有日期时间的基础上增加传入的数据量:

		LocalDateTime localDateTime2 = dateTime.plusMonths(3);	// 原有日期基础上增加3个月
        System.out.println(localDateTime2);				// 2020-09-25T10:18:38.914
        System.out.println(dateTime);					// 2020-06-25T10:18:38.914
minusXxx(xxx):

在原有日期时间基础上减去传入的数据量。

        LocalDateTime localDateTime3 = dateTime.minusDays(3);	// 原有日期基础上减去3天
        System.out.println(localDateTime3);			// 2020-06-22T10:18:38.914
        System.out.println(dateTime);				// 2020-06-25T10:18:38.914

由上面的介绍不难看出,实际上LocalDate/LocalTime/LocalDateTime三个类的方法和应用都类似于JDK1.8之前就已经存在的Calendar类(Calendar类的介绍与使用),并在Calendar类的基础上做了修缮和改进,使其适用面更广。

稍后我还将介绍下其他几个新增的时间相关类,与LocalDateTime类有较密切的交互,我会将链接贴到此处。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值