由浅到深认识Java语言(24):Date类

该文章Github地址:https://github.com/AntonyCheng/java-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(23):System类

36.Date类

定义:

Date 类表示特定的瞬间,精确到毫秒;

时间是一个有距离的长度,长度的起始是 1970 年 1 月 1 日 8 点 0 分 0 秒,这个时间是 C 语言的生日, Java 是 C 语言写的,因此 java 中的时间就是从这个时间开始计算的;

Date构造器

构造方法摘要
Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
Date(int year, int month, int date) 已过时。 从 JDK 1.1 开始,由 Calendar.set(year + 1900, month, date)GregorianCalendar(year + 1900, month, date) 取代。
Date(int year, int month, int date, int hrs, int min) 已过时。 从 JDK 1.1 开始,由 Calendar.set(year + 1900, month, date, hrs, min)GregorianCalendar(year + 1900, month, date, hrs, min) 取代。
Date(int year, int month, int date, int hrs, int min, int sec) 已过时。 从 JDK 1.1 开始,由 Calendar.set(year + 1900, month, date, hrs, min, sec)GregorianCalendar(year + 1900, month, date, hrs, min, sec) 取代。
Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
Date(String s) 已过时。 从 JDK 1.1 开始,由 DateFormat.parse(String s) 取代。

Date方法

返回类型方法解释
booleanafter(Date when) 测试此日期是否在指定日期之后。
booleanbefore(Date when) 测试此日期是否在指定日期之前。
Objectclone() 返回此对象的副本。
intcompareTo(Date anotherDate) 比较两个日期的顺序。
booleanequals(Object obj) 比较两个日期的相等性。
intgetDate() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_MONTH) 取代。
intgetDay() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_WEEK) 取代。
intgetHours() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.HOUR_OF_DAY) 取代。
intgetMinutes() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.MINUTE) 取代。
intgetMonth() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.MONTH) 取代。
intgetSeconds() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.SECOND) 取代。
longgetTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
intgetTimezoneOffset() 已过时。 从 JDK 1.1 开始,由 -(Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)) / (60 \* 1000) 取代。
intgetYear() 已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.YEAR) - 1900 取代。
inthashCode() 返回此对象的哈希码值。
static longparse(String s) 已过时。 从 JDK 1.1 开始,由 DateFormat.parse(String s) 取代。
voidsetDate(int date) 已过时。 从 JDK 1.1 开始,由 Calendar.set(Calendar.DAY_OF_MONTH, int date) 取代。
voidsetHours(int hours) 已过时。 从 JDK 1.1 开始,由 Calendar.set(Calendar.HOUR_OF_DAY, int hours) 取代。
voidsetMinutes(int minutes) 已过时。 从 JDK 1.1 开始,由 Calendar.set(Calendar.MINUTE, int minutes) 取代。
voidsetMonth(int month) 已过时。 从 JDK 1.1 开始,由 Calendar.set(Calendar.MONTH, int month) 取代。
voidsetSeconds(int seconds) 已过时。 从 JDK 1.1 开始,由 Calendar.set(Calendar.SECOND, int seconds) 取代。
voidsetTime(long time) 设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。
voidsetYear(int year) 已过时。 从 JDK 1.1 开始,由 Calendar.set(Calendar.YEAR, year + 1900) 取代。
StringtoGMTString() 已过时。 从 JDK 1.1 开始,由 DateFormat.format(Date date) 取代,使用 GMT TimeZone
StringtoLocaleString() 已过时。 从 JDK 1.1 开始,由 DateFormat.format(Date date) 取代。
StringtoString() 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
static longUTC(int year, int month, int date, int hrs, int min, int sec) 已过时。 从 JDK 1.1 开始,由 Calendar.set(year + 1900, month, date, hrs, min, sec)GregorianCalendar(year + 1900, month, date, hrs, min, sec) 取代,使用 UTC TimeZone,后跟 Calendar.getTime().getTime()

Date常用方法

after(Date when)/before(Date when) 测试此日期是否在指定日期之前/后:

package top.sharehome.Bag;

import java.util.*;

public class Demo {
	public static void main(String[] args) {
		Date d1 = new Date(0);
		Date d2 = new Date(1);
		boolean after = d1.after(d2);
		System.out.println(after);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数:

package top.sharehome.Bag;

import java.util.*;

public class Demo {
	public static void main(String[] args) {
		Date d = new Date();
		long time = d.getTime();
		System.out.println(time);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SimpleDateFormat类

定义:

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 ==> 文本)、解析(文本 ==> 日期)和规范化。

格式化标准表格:

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800

格式化示例表格:

日期和时间模式结果
"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700

格式化示例如下: SimpleDateFormat.format() 方法

将当前时刻的 long 型转换成 String 型,以便大家能看懂;

package top.sharehome.Bag;

import java.text.SimpleDateFormat;
import java.util.*;

public class Demo {
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println(d);
		//创建了一个带指定模式的 SimpleDateFormat 对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
		//使用对象格式化时间
		String format = sdf.format(d);
		System.out.println(format);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解析示例如下:

从键盘输入一个日期,解析成 Date 对象;

package top.sharehome.Bag;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Demo {
	public static void main(String[] args) throws ParseException { //抛出异常后面会有
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入xxxx年xx月xx日xx:xx:xx这样格式的时间:");
		String str = sc.next();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
		Date d0 = new Date(0);
		Date d = new Date();
		d = sdf.parse(str);
		System.out.println(d);
		System.out.println(d.getTime());
		System.out.println("1970年1月1日08:00:00的时间是:");
		System.out.println(d0);
		System.out.println(d0.getTime());
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常用构造器

常用构造方法摘要
SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

常用方法

format(Date date, StringBuffer toAppendTo, FieldPosition pos) 将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer

package top.sharehome.Bag;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo {
	public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd  HH:mm:ss");
		Date d = new Date(0);
		String format = sdf.format(d);
		System.out.println(format);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

parse(String text, ParsePosition pos) 解析字符串的文本,生成 Date

package top.sharehome.Bag;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo {
	public static void main(String[] args) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd  HH:mm:ss");
		String str = "1970.01.01  08:00:00";
		Date parse = sdf.parse(str);
		System.out.println(parse);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Calendar类

定义:

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

如何获得一个 Calendar 对象:

因为 Calendar 对象受保护,可以通过继承来获得一个 Calendar 对象:

package top.sharehome.Bag;

import java.util.Calendar;
import java.util.Date;

public class Demo {
	public static void main(String[] args) {
		Calendar c = new A();
	}
}
class A extends Calendar{

	@Override
	protected void computeTime() {
		// TODO Auto-generated method stub
		
	}

	@Override
	protected void computeFields() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void add(int field, int amount) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void roll(int field, boolean up) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int getMinimum(int field) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getMaximum(int field) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getGreatestMinimum(int field) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getLeastMaximum(int field) {
		// TODO Auto-generated method stub
		return 0;
	}
}

显然,这并不是一个好的方法;

查文档发现 Calendar 类中含有一些静态的方法,例如 Calendar.getInstance() ,即可以直接通过调用该方法获取一个 Calendar 对象:

package top.sharehome.Bag;

import java.util.Calendar;

public class Demo {
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
	}
}

查文档又发现 Calendar 对象中包含着一个可以被操作的 Date 对象,可以通过 getTime() 来获取该 Date 对象:

package top.sharehome.Bag;

import java.util.Calendar;
import java.util.Date;

public class Demo {
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		Date time = c.getTime();
	}
}

Calendar字段

字段摘要
static intALL_STYLES 指示所有风格名称的 getDisplayNames 的风格说明符,比如 “January” 和 “Jan”。
static intAM 指示从午夜到中午之前这段时间的 AM_PM 字段值。
static intAM_PM getset 的字段数字,指示 HOUR 是在中午之前还是在中午之后。
static intAPRIL 指示在格里高利历和罗马儒略历中一年中第四个月的 MONTH 字段值。
protected booleanareFieldsSet 如果 fields[] 与当前的设置时间同步,则返回 true。
static intAUGUST 指示在格里高利历和罗马儒略历中一年中第八个月的 MONTH 字段值。
static intDATE getset 的字段数字,指示一个月中的某天。
static intDAY_OF_MONTH getset 的字段数字,指示一个月中的某天。
static intDAY_OF_WEEK getset 的字段数字,指示一个星期中的某天。
static intDAY_OF_WEEK_IN_MONTH getset 的字段数字,指示当前月中的第几个星期。
static intDAY_OF_YEAR getset 的字段数字,指示当前年中的天数。
static intDECEMBER 指示在格里高利历和罗马儒略历中一年中第十二个月的 MONTH 字段值。
static intDST_OFFSET getset 的字段数字,以毫秒为单位指示夏令时的偏移量。
static intERA 指示年代的 getset 的字段数字,比如罗马儒略历中的 AD 或 BC。
static intFEBRUARY 指示在格里高利历和罗马儒略历中一年中第二个月的 MONTH 字段值。
static intFIELD_COUNT getset 可识别的不同字段的数量。
protected int[]fields 此日历当前设置时间的日历字段值。
static intFRIDAY 指示 Friday 的 DAY_OF_WEEK 字段值。
static intHOUR getset 的字段数字,指示上午或下午的小时。
static intHOUR_OF_DAY getset 的字段数字,指示一天中的小时。
protected boolean[]isSet 通知是否设置了该日历某一指定日历字段的标志。
protected booleanisTimeSet 如果 time 值是一个有效值,则返回 true。
static intJANUARY 指示在格里高利历和罗马儒略历中一年中第一个月的 MONTH 字段值。
static intJULY 指示在格里高利历和罗马儒略历中一年中第七个月的 MONTH 字段值。
static intJUNE 指示在格里高利历和罗马儒略历中一年中第六个月的 MONTH 字段值。
static intLONG 指示长名称的 getDisplayNamegetDisplayNames 的风格说明符,比如 “January”。
static intMARCH 指示在格里高利历和罗马儒略历中一年中第三个月的 MONTH 字段值。
static intMAY 指示在格里高利历和罗马儒略历中一年中第五个月的 MONTH 字段值。
static intMILLISECOND getset 的字段数字,指示一秒中的毫秒。
static intMINUTE getset 的字段数字,指示一小时中的分钟。
static intMONDAY 指示 Monday 的 DAY_OF_WEEK 字段值。
static intMONTH 指示月份的 getset 的字段数字。
static intNOVEMBER 指示在格里高利历和罗马儒略历中一年中第十一个月的 MONTH 字段值。
static intOCTOBER 指示在格里高利历和罗马儒略历中一年中第十个月的 MONTH 字段值。
static intPM 指示从中午到午夜之前这段时间的 AM_PM字段值。
static intSATURDAY 指示 Saturday 的 DAY_OF_WEEK 字段值。
static intSECOND getset 的字段数字,指示一分钟中的秒。
static intSEPTEMBER 指示在格里高利历和罗马儒略历中一年中第九个月的 MONTH 字段值。
static intSHORT 指示短名称的 getDisplayNamegetDisplayNames 的风格说明符,比如 “Jan”。
static intSUNDAY 指示 Sunday 的 DAY_OF_WEEK 字段值。
static intTHURSDAY 指示 Thursday 的 DAY_OF_WEEK 字段值。
protected longtime 日历的当前设置时间,以毫秒为单位,表示自格林威治标准时间 1970 年 1月 1 日 0:00:00 后经过的时间。
static intTUESDAY 指示 Tuesday 的 DAY_OF_WEEK 字段值。
static intUNDECIMBER 指示一年中第十三个月的 MONTH 字段值。
static intWEDNESDAY 指示 Wednesday 的 DAY_OF_WEEK 字段值。
static intWEEK_OF_MONTH getset 的字段数字,指示当前月中的星期数。
static intWEEK_OF_YEAR getset 的字段数字,指示当前年中的星期数。
static intYEAR 指示年的 getset 的字段数字。
static intZONE_OFFSET] getset 的字段数字,以毫秒为单位指示距 GMT 的大致偏移量。

常用方法

add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量;

package top.sharehome.Bag;

import java.util.Calendar;
import java.util.Date;

public class Demo {
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println("现在时间是"+d);
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, -10);
		c.add(Calendar.MONTH, 2);
		System.out.println("我在今天的基础上减了十天后再往后推了2个月!");
		Date time = c.getTime();
		System.out.println(time);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

set() 给日历设定数值;

方法的重载
voidset(int field, int value) 将给定的日历字段设置为给定值。
voidset(int year, int month, int date) 设置日历字段 YEARMONTHDAY_OF_MONTH 的值。
voidset(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEARMONTHDAY_OF_MONTHHOUR_OF_DAYMINUTE 的值。
voidset(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEARMONTHDAY_OF_MONTHHOURMINUTESECOND 的值。
//不只是上面这样的代入方式,还可以是单个指明参数
package top.sharehome.Bag;

import java.util.Calendar;
import java.util.Date;

public class Demo {
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR,2012);
		c.set(Calendar.MONTH, 0);
		c.set(Calendar.DATE, 1);
		c.set(Calendar.HOUR_OF_DAY, 8);
		c.set(Calendar.MINUTE, 23);
		c.set(Calendar.SECOND, 12);
		Date time = c.getTime();
		System.out.println(time);
	}
}

MOUTH的值是从 0 算起的,即 0 ~ 11 代表着十二个月

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示例如下:

我们想要获得一个 2018 年 7 月 7 日的 Date 数据;

方法一:解析;

package top.sharehome.Bag;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo {
	public static void main(String[] args) throws ParseException {
		String str = "2018年7月7日";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		Date parse = sdf.parse(str);
		System.out.println(parse);
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方法二:Calendar 类;

package top.sharehome.Bag;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Demo {
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		c.set(2018,6,7,0,0,0);
		Date time = c.getTime();
		System.out.println(time);	
	}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

LocalDate本地日期

  • 获取该类的对象,静态方法
    • static LocalDate now() 获取LocalDate的对象,跟随操作系统
    • static LocalDate of() 获取LocalDate的对象,自己设置日期
      • of方法中传递年月日 of(int year,int month,int day)
/**
* LocalDate的静态方法获取对象
*/
public static void getInstance(){
    //静态方法now()
    LocalDate localDate = LocalDate.now();
    System.out.println("localDate = " + localDate);

    //静态方法of()设置日期
    LocalDate of =  LocalDate.of(2022,5,10);
    System.out.println("of = " + of);
}
  • 获取日期字段的方法 : 名字是get开头
    • int getYear() 获取年份
    • int getDayOfMonth()返回月中的天数
    • int getMonthValue() 返回月份
/**
* LocalDate类的方法 getXXX()获取日期字段
*/
public static void get(){
    LocalDate localDate = LocalDate.now();
    //获取年份
    int year = localDate.getYear();
    //获取月份
    int monthValue = localDate.getMonthValue();
    //获取天数
    int dayOfMonth = localDate.getDayOfMonth();
    System.out.println("year = " + year);
    System.out.println("monthValue = " + monthValue);
    System.out.println("dayOfMonth = " + dayOfMonth);
}
  • 设置日期字段的方法 : 名字是with开头

    • LocalDate withYear(int year)设置年份

    • LocalDate withMonth(int month)设置月份

    • LocalDate withDayOfMonth(int day)设置月中的天数

    • LocalDate对象是不可比对象,设置方法with开头,返回新的LocalDate对象

/**
     * LocalDate类的方法 withXXX()设置日期字段
     */
public static void with(){
    LocalDate localDate = LocalDate.now();
    System.out.println("localDate = " + localDate);
    //设置年,月,日
    //方法调用链
    LocalDate newLocal = localDate.withYear(2025).withMonth(10).withDayOfMonth(25);
    System.out.println("newLocal = " + newLocal);
}
  • 设置日期字段的偏移量, 方法名plus开头,向后偏移
  • 设置日期字段的偏移量, 方法名minus开头,向前偏移
 /**
     * LocalDate类的方法 minusXXX()设置日期字段的偏移量,向前
     */
    public static void minus() {
        LocalDate localDate = LocalDate.now();
        //月份偏移10个月
        LocalDate minusMonths = localDate.minusMonths(10);
        System.out.println("minusMonths = " + minusMonths);
    }
    /**
     * LocalDate类的方法 plusXXX()设置日期字段的偏移量,向后
     */
    public static void plus(){
        LocalDate localDate = LocalDate.now();
        //月份偏移10个月
        LocalDate plusMonths = localDate.plusMonths(10);
        System.out.println("plusMonths = " + plusMonths);
    }

Period和Duration类

Period计算日期之间的偏差
  • static Period between(LocalDate d1,LocalDate d2)计算两个日期之间的差值.
    • 计算出两个日期相差的天数,月数,年数
public static void between(){
    //获取2个对象,LocalDate
    LocalDate d1 = LocalDate.now(); // 2021-4-13
    LocalDate d2 = LocalDate.of(2022,4,13); // 2022-6-15
    //Period静态方法计算
    Period period = Period.between(d1, d2);
    //period非静态方法,获取计算的结果
    int years = period.getYears();
    System.out.println("相差的年:"+years);
    int months = period.getMonths();
    System.out.println("相差的月:"+months);
    int days = period.getDays();
    System.out.println("相差的天:"+days);
}
Duration计算时间之间的偏差
  • static Period between(Temporal d1,Temporal d2)计算两个日期之间的差值.
 public static void between(){
        LocalDateTime d1 = LocalDateTime.now();
        LocalDateTime d2 = LocalDateTime.of(2021,5,13,15,32,20);
       // Duration静态方法进行计算对比
        Duration duration = Duration.between(d1, d2);
        // Duration类的对象,获取计算的结果
        long minutes = duration.toMinutes();
        System.out.println("相差分钟:" + minutes);

        long days = duration.toDays();
        System.out.println("相差天数:"+days);

        long millis = duration.toMillis();
        System.out.println("相差秒:" + millis);

        long hours = duration.toHours();
        System.out.println("相差小时:"+hours);
    }
DateTimeFormatter

JDK8中的日期格式化对象 : java.time.format包

  • static DateTimeFormatter ofPattern(String str)自定义的格式
  • String format(TemporalAccessor t)日期或者时间的格式化
  • TemporalAccessor parse(String s)字符串解析为日期对象
/**
* 方法parse,字符串转日期
*/
public static void parse(){
    //静态方法,传递日期格式,返回本类的对象
    DateTimeFormatter dateTimeFormatter =
    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String str = "2021-04-13 15:55:55";
    //dateTimeFormatter调用方法parse转换
    //返回接口类型,接口是LocalDate,LocalDateTime 都实现了该接口
    TemporalAccessor temporalAccessor = dateTimeFormatter.parse(str);
    //System.out.println(temporalAccessor);
    LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
    System.out.println(localDateTime);
}

/**
* 方法format格式化
*
*/
public static void format(){
    //静态方法,传递日期格式,返回本类的对象
    DateTimeFormatter dateTimeFormatter =
    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    //dateTimeFormatter对象调用方法format
    String format = dateTimeFormatter.format(LocalDateTime.now());
    System.out.println(format);
}

下一章:由浅到深认识Java语言(25):正则表达式