Java时间类Date、Calender 、LocalDateTime总结

本文总结了Java中的Date、Calendar和LocalDateTime类。Date类用于表示时间,有无参和有参构造方法,可用于日期比较和格式化。Calendar类提供日期和时间的抽象表示,不可直接实例化,主要功能是获取和设置日历字段。LocalDateTime类包含年月日时分秒,提供了初始化、增加或减少日期值、调整日期、比较日期以及格式化日期等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java时间类Date、Calender 、LocalDateTime总结

代码环境:

​ java version “11.0.14” 2022-01-18 LTS

​ IntelliJ IDEA 2020.3 (Ultimate Edition)

​ Windows 10 企业版 LTSC 21H2 19044.1706


一、Date类

1、无参构造方法

Date 类的无参构造函数所创建的对象可以获取本机当前时间,例如:

Date date = new Date();//Date类在java.util包中
System.out.println(date);//输出当前时间

[^Fri Jun 10 19:35:23 CST 2022]: Date 对象表示时间的默认顺序为:星期、月、日、小时、分、秒、年。

2、有参构造方法

计算机系统自身时间是1970年1月1日0时,也就是格林威治时间,可以根据这个时间使用 Date 有参的构造方法创建 Date 对象。例如:

Date date1 = new Date(1000);
Date date2 = new Date(-1000);

[^Thu Jan 01 08:00:01 CST 1970]:
[^Thu Jan 01 07:59:59 CST 1970]:

Date 类有如下两个构造方法:
  • Date(): 使用该构造方法创建的对象可以获取本地的当前时间。

  • Date(long date):此种形式表示从 GMT 时间(格林尼治时间)1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。

方法描述
boolean after(Date when)判断此日期是否在指定日期之后
boolean before(Date when)判断此日期是否在指定日期之前
int compareTo(Date anotherDate)比较两个日期的顺序
boolean equals(Object obj)比较两个日期的相等性
long getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来,此 Date 对象表示的毫秒数
String toString()String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
日期比较
  • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
  • 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
  • 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。
格式化时间

这里只使用最常用的

Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(dateFormat.format(date));

二、Calender类

Date类和Calendar类都是关于日期的类,都在java.util包中,使用时需要import。
Calendar提供了获取或设置各种日历字段的方法。是抽象的,无法实例化
构造方法:protected Calendar :由于修饰词是 protected ,无法直接创建对象。

方法名说明
static Calendar getInstance()使用默认时区和区域获取日历。
void set(int year , int month , int date , int hourofday , int second)设置日历的年月日时分。
int get(int field)返回给日历字段的值。如年、月、日等
void setTime(Date date)用给定的Date设置日历的时间。Date-Calendar
Date getTime()返回一个Date表示此日历的时间。Calendar-Date
void add(int field , int amount)按照日历的规则,给指定的字段添加或减少时间
long getTimeMillies()毫秒为单位返回该日历的时间。

格式化时间

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
// getTime() 转化为Date格式去转换
System.out.println(calendar.getTime());

三、LocalDateTime类

LocalDate:只含年月日的日期对象
LocalTime:只含时分秒的时间对象
LocalDateTime:同时含有年月日时分秒的日期对象

LocalDate - 初始化

1. now(): 给出LocalDate实例,该实例包含默认时区的系统时钟的当前日期。

2. now(Clock clock): 提供LocalDate实例,该实例具有从指定时钟获得的当前日期。

3. now(ZoneId zone): 给出当前日期的LocalDate实例,该日期来自指定时区的系统时钟

4. of(int year, int month, int dayOfMonth: 从给定的年、月、日中获得LocalDate实例,输入数据类型为int

5. of(int year, Month month, int dayOfMonth): 从给定的年(int)、月(Month)和日(int)给出LocalDate实例。

6. ofEpochDay(long epochDay): 从给定的纪元日数中给出LocalDate实例。

7. ofInstant(Instant instant, ZoneId zone): 从给定的InstantZoneId给出LocalDate实例。

LocalDate localDate = LocalDate.ofInstant(Instant.now(), ZoneId.systemDefault()); 

8. ofYearDay(int year, int dayOfYear): 从给定的年份和年份中的天数给出LocalDate实例,输入数据类型为int

9. parse(CharSequence text): 从给定的文本字符串,如 "2018-10-01",给出LocalDate实例。

LocalDate localDate = LocalDate.parse("2018-10-01"); 

10. parse(CharSequence text, DateTimeFormatter formatter): 从给定格式的文本字符串中获得LocalDate实例。输出的LocalDate将是yyyy-MM-dd格式。

LocalDate localDate = LocalDate.parse("15-03-2018", DateTimeFormatter.ofPattern("dd-MM-yyyy")); 

11. from(TemporalAccessor temporal): 从给定的时间对象中获得LocalDate实例。

plus - 按给定数量增加日期值

1. plus(long amountToAdd, TemporalUnit unit): 通过增加给定的数量返回LocalDate实例。

LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);

LocalDate localDate2 = localDate1.plus(15, ChronoUnit.DAYS);
System.out.println(localDate2);

2. plus(TemporalAmount amountToAdd): 通过添加指定的TemporalAmount返回LocalDate实例。

LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
	
LocalDate localDate2 = localDate1.plus(Period.ofDays(15));
System.out.println(localDate2); 

3. plusDays(long daysToAdd): 通过添加指定的天数返回LocalDate实例。

4. plusWeeks(long weeksToAdd): 通过添加指定的周数返回 LocalDate 实例,用法与plusDays类似。

5. plusMonths(long monthsToAdd): 通过添加指定的月数返回 LocalDate 实例,用法与plusDays类似。

6. plusYears(long yearsToAdd): ,通过添加指定的年数返回 LocalDate 实例,用法与plusDays类似。

minus - 按给定数量减去日期值

1. minus(long amountToSubtract, TemporalUnit unit): 通过减去给定的数量返回LocalDate实例。

LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);

LocalDate localDate2 = localDate1.minus(15, ChronoUnit.DAYS);
System.out.println(localDate2);

2. minus(TemporalAmount amountToSubtract): 通过减去指定的TemporalAmount返回LocalDate实例。

3. minusDays(long daysToSubtract): 通过减少指定的天数返回LocalDate实例。

4. minusWeeks(long weeksToSubtract): 通过减少指定的周数返回 LocalDate 实例,用法与minusDays相似。

5. minusMonths(long monthsToSubtract): 通过减少指定的月数返回 LocalDate 实例,用法与minusDays相似。

6. minusYears(long yearsToSubtract): ,通过减少指定的年数返回 LocalDate 实例,用法与minusDays相似。

with - 调整日期

1. with(TemporalAdjuster adjuster): 返回用给定的TemporalAdjuster调整的LocalDate实例。

LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
	
LocalDate localDate2 = localDate1.with(DayOfWeek.SUNDAY);
System.out.println(localDate2); 

2. with(TemporalField field, long newValue): 将指定字段的LocalDate实例返回到一个新值。

3. withDayOfMonth(int dayOfMonth): 通过用给定的值改变月份中的号数来返回LocalDate实例。

4. withDayOfYear(int dayOfYear): 通过使用给定值更改一年中的某一天来返回 LocalDate 实例。一年中的第几天的有效值为 1365,闰年的有效值为 1366

5. withMonth(int month): 通过用给定的值改变年的月份来返回LocalDate实例。有效值是112

6. withYear(int year): 通过用给定值改变年份来返回LocalDate实例。

get - 获取日期信息(get方法)

LocalDate format() 转换格式

LocalDate 的默认日期格式为 yyyy-MM-dd

format 方法使用指定的格式化程序格式化日期。

LocalDate localDate = LocalDate.parse("2018-02-18");
String formattedDate = localDate.format(DateTimeFormatter.ofPattern("MMM dd, yyyy"));
System.out.println(formattedDate);

atTime() - 将 LocalDate 与时间结合转化为 LocalDateTime

atTime 方法将 LocalDate 与给定时间结合起来,并返回 LocalDateTime 实例。

我们可以将以下参数传递给 atTime 方法。

atTime(int hour, int minute)
atTime(int hour, int minute, int second)
atTime(int hour, int minute, int second, int nanoOfSecond)
atTime(LocalTime time) 

示例

LocalDate localDate = LocalDate.parse("2018-05-02");
System.out.println(localDate);

//hour and minute
LocalDateTime localDateTime = localDate.atTime(16, 50);
System.out.println(localDateTime);

//hour, minute and second
localDateTime = localDate.atTime(16, 50, 20);
System.out.println(localDateTime);	

//hour, minute, second and nanoOfSecond	
localDateTime = localDate.atTime(16, 50, 20, 300);
System.out.println(localDateTime);	

//Using LocalTime
localDateTime = localDate.atTime(LocalTime.now());
System.out.println(localDateTime);		

我们还可以将 OffsetTime 传递给将返回 OffsetDateTime 实例的 atTime

OffsetDateTime  offsetDateTime  = localDate.atTime(OffsetTime.now());
System.out.println(offsetDateTime)
atStartOfDay() 将 LocalDate 转化为 LocalDateTime

atStartOfDay方法将LocalDate00:00的时间结合起来,在这个日期的开始创建LocalDateTime实例。

为了得到ZonedDateTime实例,我们需要将ZoneId实例传递给atStartOfDay方法。

找到atStartOfDay方法的声明。

LocalDateTime atStartOfDay()
ZonedDateTime atStartOfDay(ZoneId zone) 
LocalDate isAfter(), isBefore() and isEqual() 比较日期

isAfter(ChronoLocalDate other): 检查此日期是否在给定日期之后。

isBefore(ChronoLocalDate other): 检查此日期是否在给定日期之前。

isEqual(ChronoLocalDate other): 检查此日期是否等于给定日期。

LocalDate isLeapYear(), isSupported() 检查闰年和输入域

isLeapYear(): 检查年份是否为闰年。

isSupported(TemporalField field): 检查是否支持给定字段。在从日期获取任何字段之前,我们可以检查该字段是否受支持,否则我们可能会出错。

isSupported(TemporalUnit unit): 检查是否支持给定的单位。在使用加减之前,我们可以检查是否支持给定的单位,否则我们可能会出错。

LocalDate localDate = LocalDate.parse("2016-03-18");
System.out.println(localDate.isLeapYear());
System.out.println(localDate.isSupported(ChronoField.DAY_OF_MONTH));
System.out.println(localDate.isSupported(ChronoUnit.HOURS));
LocalDate lengthOfMonth(), lengthOfYear() 检查月份和年份天数最大值

lengthOfMonth(): 给出月份的最大天数,例如 28、29、30、31。

lengthOfYear(): 给出年份的最大天数 365 或 366(闰年)。

LocalDate datesUntil() 返回指定时间段

Java 9 中引入了LocalDate 中的datesUntil 方法。

datesUntil 方法返回不包括给定日期的有序的日期流。

我们也可以通过 period 来设置增量步长。

我们获取从该日期开始到指定日期的日期流。

指定的日期将被排除在结果中。

LocalDate localDate = LocalDate.parse("2018-02-18");
	
System.out.println("--- With LocalDate ---");
Stream<LocalDate> localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"));
localDateStream.forEach(date -> System.out.println(date));

System.out.println("--- With LocalDate and Period ---");
localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"), Period.ofDays(2));
localDateStream.forEach(date -> System.out.println(date));  
LocalDate until() 计算两个日期之间的时间量

1.计算此日期和指定日期之间的时期为Period

2.计算距指定日期(不包括)的时间量。

LocalDate localDate = LocalDate.parse("2018-02-18");
	
Period period = localDate.until(LocalDate.parse("2018-03-28"));
System.out.println(period.getDays());

long val = localDate.until(LocalDate.parse("2018-03-28"), ChronoUnit.DAYS);
System.out.println(val);
LocalDate compareTo() and equals() 比较日期

compareTo(ChronoLocalDate other): 将此日期与指定日期进行比较。

equals(Object obj): 检查此日期是否等于指定日期。

LocalDate adjustInto() 复制日期

adjustInto方法将指定的时间对象调整为与此对象具有相同的日期。

LocalDate query() 查询日期

query方法使用指定的查询方式查询这个日期。

TemporalUnit unit = localDate.query(TemporalQueries.precision());

输出为Days

TemporalQueries.precision()查询最小的支持单位。

它返回TemporalQuery的实例。

LocalDate range() 字段有效值范围。

range给出指定字段的有效值范围。

LocalDate localDate = LocalDate.parse("2018-02-18");
	
ValueRange vrange = localDate.range(ChronoField.DAY_OF_MONTH);
System.out.println(vrange);
    
vrange = localDate.range(ChronoField.DAY_OF_WEEK);
System.out.println(vrange);

在上面的代码中,日期是“2018-02-18”

我们可以看到这个日期年二月的日期范围可以是 1 – 28,星期几是 1 – 7

LocalDate toEpochDay() and toEpochSecond()

toEpochDay(): 将此日期转换为历法日,并返回long值。
toEpochSecond(LocalTime time, ZoneOffset offset): 此日期转换为自1970-01-01T00:00:00Z纪元以来的秒数,并返回long值。在Java 9中引入。

LocalDate localDate = LocalDate.parse("2018-02-18");
System.out.println(localDate.toEpochDay());
System.out.println(localDate.toEpochSecond(LocalTime.now(), ZoneOffset.MAX)); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值