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): 从给定的Instant
和ZoneId
给出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
实例。一年中的第几天的有效值为 1
到 365
,闰年的有效值为 1
到 366
。
5. withMonth(int month): 通过用给定的值改变年的月份来返回LocalDate
实例。有效值是1
到12
。
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
方法将LocalDate
与00: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));