Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?

2022-10-14,,,,

当前时间:2019年10月24日。距离 jdk 14 发布时间(2020年3月17日)还有多少天?

// 距离jdk 14 发布还有多少天?
localdate jdk14 = localdate.of(2020, 3, 17);
localdate nowdate = localdate.now();
system.out.println("距离jdk 14 发布还有:"+nowdate.until(jdk14,chronounit.days)+"天");

jdk 8 已经在 2014年 3月 18日正式可用 ,距离现在已经 5年多时间过去了。5年时间里很多企业也都换上了 jdk 8,明年 3月份 jdk14 也要来了,那么 jdk 8 的新特性你真的用起来了吗?我准备写一个 jdk 8开始的新特性介绍以及使用的系列文章,后续 jdk 也会继续更新,你如果需要的话不妨关注下博客或者公众号。

1. 时间处理类

jdk8 带来了全新的时间处理工具类,用于代替之前存在缺陷的时间处理。新的时间处理相比之前更加简单好用。

常用的类有以下几个类。

时间相关类 介绍
localdatetime 时间处理类,最高精确到纳秒
localdate 时间处理类,最高精确到天
datetimeformatter 时间格式化
zoneid 时区设置类

2. 时间获取

使用不同的类可以获取不同精度的时间。

/**
 * 时间获取
*/
@test
public void nowtimetest() {
    // 当前精确时间
    localdatetime now = localdatetime.now();
    system.out.println("当前精确时间:" + now);
    system.out.println("当前精确时间:" + now.getyear() + "-" + now.getmonthvalue() + "-" + now.getdayofmonth() + " " + now.gethour() + "-" + now.getminute() + "-" + now.getsecond());

    // 获取当前日期
    localdate localdate = localdate.now();
    system.out.println("当前日期:" + localdate);
    system.out.println("当前日期:" + localdate.getyear() + "-" + localdate.getmonthvalue() + "-" + localdate.getdayofmonth());

    // 获取当天时间
    localtime localtime = localtime.now();
    system.out.println("当天时间:" + localtime);
    system.out.println("当天时间:" + localtime.gethour() + ":" + localtime.getminute() + ":" + localtime.getsecond());

    // 有时区的当前精确时间
    zoneddatetime nowzone = localdatetime.now().atzone(zoneid.systemdefault());
    system.out.println("当前精确时间(有时区):" + nowzone);
    system.out.println("当前精确时间(有时区):" + nowzone.getyear() + "-" + nowzone.getmonthvalue() + "-" + nowzone.getdayofmonth() + " " + nowzone.gethour() + "-" + nowzone.getminute() + "-" + nowzone.getsecond());
} 

获取到的时间:

当前精确时间:2019-10-24t00:26:41.724
当前精确时间:2019-10-24 0-26-41
当前日期:2019-10-24
当前日期:2019-10-24
当前精确时间(有时区):2019-10-24t00:26:41.725+08:00[gmt+08:00]
当前精确时间(有时区):2019-10-24 0-26-41
当天时间:00:26:41.725
当天时间:0:26:41

3. 时间创建

可以指定年月日时分秒创建一个时间类,也可以使用字符串直接转换成时间。

/**
 * 时间创建
 */
@test
public void createtime() {
    localdatetime oftime = localdatetime.of(2019, 10, 1, 8, 8, 8);
    system.out.println("当前精确时间:" + oftime);

    localdate localdate = localdate.of(2019, 10, 01);
    system.out.println("当前日期:" + localdate);

    localtime localtime = localtime.of(12, 01, 01);
    system.out.println("当天时间:" + localtime);
}

创建的时间:

当前精确时间:2019-10-01t08:08:08
当前日期:2019-10-01
当天时间:12:01:01

4. 时间转换

/**
* 日期转换
*/
@test
public void converttimetest() {
    localdatetime parsetime = localdatetime.parse("2019-10-01t22:22:22.222");
    system.out.println("字符串时间转换:" + parsetime);

    localdate formatted = localdate.parse("20190101", datetimeformatter.basic_iso_date);
    system.out.println("字符串时间转换-指定格式:" + formatted);

    // date 转换成 localdatetime
    date date = new date();
    zoneid zoneid = zoneid.systemdefault();
    system.out.println("date 转换成 localdatetime:" + localdatetime.ofinstant(date.toinstant(), zoneid));

    // localdatetime 转换成 date
    localdatetime localdatetime = localdatetime.now();
    date todate = date.from(localdatetime.atzone(zoneid.systemdefault()).toinstant());
    system.out.println("localdatetime 转换成 date:" + todate);\
        
    // 当前时间转时间戳
    long epochmilli = localdatetime.now().toinstant(zoneoffset.of("+8")).toepochmilli();
    system.out.println("当前时间转时间戳:" + epochmilli);
    // 时间戳转换成时间
    localdatetime epochmillitime = localdatetime.ofinstant(instant.ofepochmilli(epochmilli), zoneid.systemdefault());
    system.out.println("时间戳转换成时间:" + epochmillitime);
}

转换结果:

字符串时间转换:2019-10-01t22:22:22.222
字符串时间转换-指定格式:2019-01-01
date 转换成 localdatetime:2019-10-24t00:46:41.251
localdatetime 转换成 date:thu oct 24 00:46:41 gmt+08:00 2019
当前时间转时间戳:1571849201258
时间戳转换成时间:2019-10-24t00:46:41.258

5. 时间格式化

/**
 * 日期格式化
 */
@test
public void formattest() {
    localdatetime now = localdatetime.now();
    system.out.println("当前时间:" + now);
    system.out.println("格式化后:" + now.format(datetimeformatter.iso_local_date_time));
    system.out.println("格式化后:" + now.format(datetimeformatter.iso_local_date));
    system.out.println("格式化后:" + now.format(datetimeformatter.iso_local_time));
    system.out.println("格式化后:" + now.format(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss")));
}

格式化后:

当前时间:2019-10-24t00:37:44.867
格式化后:2019-10-24t00:37:44.867
格式化后:2019-10-24
格式化后:00:37:44.867
格式化后:2019-10-24 12:37:44

6. 时间比较

/**
 * 时间比较
 */
@test
public void difftest() {
    localdatetime now = localdatetime.now();
    localdatetime yestory = now.minusdays(1);
    system.out.println(now + "在" + yestory + "之后吗?" + now.isafter(yestory));
    system.out.println(now + "在" + yestory + "之前吗?" + now.isbefore(yestory));

    // 时间差
    long day = yestory.until(now, chronounit.days);
    long month = yestory.until(now, chronounit.months);
    long hours = yestory.until(now, chronounit.hours);
    long minutes = yestory.until(now, chronounit.minutes);
    system.out.println("相差月份" + month);
    system.out.println("相差天数" + day);
    system.out.println("相差小时" + hours);
    system.out.println("相差分钟" + minutes);

    // 距离jdk 14 发布还有多少天?
    localdate jdk14 = localdate.of(2020, 3, 17);
    localdate nowdate = localdate.now();
    system.out.println("距离jdk 14 发布还有:" + nowdate.until(jdk14, chronounit.days) + "天");
}

比较结果:

2019-10-24t00:39:01.589在2019-10-23t00:39:01.589之后吗?true
2019-10-24t00:39:01.589在2019-10-23t00:39:01.589之前吗?false
相差月份0
相差天数1
相差小时24
相差分钟1440
距离jdk 14 发布还有:145天

7. 时间加减

/**
 * 日期加减
 */
@test
public void calctest() {
    localdatetime now = localdatetime.now();
    system.out.println("当前时间:"+now);
    localdatetime plustime = now.plusmonths(1).plusdays(1).plushours(1).plusminutes(1).plusseconds(1);
    system.out.println("增加1月1天1小时1分钟1秒时间后:" + plustime);
    localdatetime minustime = now.minusmonths(2);
    system.out.println("减少2个月时间后:" + minustime);
}

操作结果:

当前时间:2019-10-24t00:41:08.877
增加1月1天1小时1分钟1秒时间后:2019-11-25t01:42:09.877
减少2个月时间后:2019-08-24t00:41:08.877    

8. 时间扩展方法

/**
 * 时间方法
 */
@test
public void timefunctiontest() {
    localdatetime now = localdatetime.now();
    system.out.println("当前时间:" + now);
    // 第一天
    localdatetime firstday = now.withdayofmonth(1);
    system.out.println("本月第一天:" + firstday);
    // 当天最后一秒
    localdatetime lastsecondofday = now.withhour(23).withminute(59).withsecond(59);
    system.out.println("当天最后一秒:" + lastsecondofday);
    // 最后一天
    localdatetime lastday = now.with(temporaladjusters.lastdayofmonth());
    system.out.println("本月最后一天:" + lastday);
    // 是否闰年
    system.out.println("今年是否闰年:" + year.isleap(now.getyear()));
}

输出结果:

当前时间:2019-10-24t00:43:28.296
本月第一天:2019-10-01t00:43:28.296
当天最后一秒:2019-10-24t23:59:59.296
本月最后一天:2019-10-31t00:43:28.296
今年是否闰年:false

jdk 8 新的时间类使用起来相比之前显得更加方便简单。

jdk 8 也把时间处理成独立成一个包,并且使用不同的类名加以区分。而不是像之前相同的类名不同的包。这样的方式使用起来也更加清晰。

《Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?.doc》

下载本文的Word格式文档,以方便收藏与打印。