Java 8的LocalDate类是Java日期和时间API的一部分,没有时间和时区的概念,是线程安全的,用于表示不包含时间的日期,位于java.time包下。
按系统默认的时区来获取当前日期,返回代表当前日期的 LocalDate 实例。
@Testpublic void test() { LocalDate now = LocalDate.now();//当前日期 String format = now.format(DateTimeFormatter.ISO_DATE);
System.out.println(format);//输出结果:2023-11-23 }
接受一个年份(int)和两个日期(int)作为参数,返回一个表示该年某一天的 LocalDate 实例。日期的第一个参数范围是1到31,第二个参数范围是0到23。
public void test2() { LocalDate localDate = LocalDate.of(2023, 2, 1);//定义一个日期:2023-02-01 LocalDate localDate1 = LocalDate.of(2023, Month.FEBRUARY, 1);//定义一个日期:2023-02-01 boolean equals = localDate1.equals(localDate); System.out.println(equals);//输出结果:true}
用于将给定的Unix时间戳(自1970年1月1日以来的天数)转换为 LocalDate 对象。这个方法返回一个表示该日期的 LocalDate 实例
@Testpublic void test3() { LocalDate localDate2 = LocalDate.ofEpochDay(1);// 假设给定的Unix时间戳为1天 String format = localDate2.format(DateTimeFormatter.ISO_DATE); System.out.println(format);//输出结果:1970-01-02}
Instant 是 Java 中的一个时间类,表示一个瞬时的时间点,精确到纳秒。Instant.ofEpochSecond()用于根据秒数(从1970年1月1日00:00:00 UTC开始)创建一个新的 Instant 对象。LocalDate.ofInstant() 可以将给定的 Instant 对象转换为 LocalDate 对象。
@Testpublic void test4() { Long seconds = 24 * 60 * 60L;//一天的秒数 LocalDate localDate = LocalDate.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault()); String format = localDate.format(DateTimeFormatter.ISO_DATE); System.out.println(format);//输出结果:1970-01-02}
LocalDate.ofYearDay() 用于创建一个表示某一年中特定天数的 LocalDate 对象。方法接受两个参数:年份和一年中的天数。年份表示自1970年以来的年数,天数表示一年中的第几天。例如,1月1日是第1天,2月15日是第46天。需要注意的是,这个方法并不会对输入的天数进行有效性检查,因此如果输入的天数超出了给定年份的范围(例如,在2月输入了30),那么创建出来的 LocalDate 对象可能不准确。
@Testpublic void test5() { LocalDate localDate = LocalDate.ofYearDay(2023, 2); String format = localDate.format(DateTimeFormatter.ISO_DATE); System.out.println(format);//输出结果:2023-01-02}
LocalDate.get(...) 可以获取给定日期的特定部分,如年份、月份或日期。具体来说,如果你调用 LocalDate.get(ChronoField),其中 ChronoField 是 java.time.temporal.ChronoField 的实例,那么就会返回该日期对应的特定部分。ChronoField 是一个枚举类型,包含如 YEAR、MONTH_OF_YEAR、DAY_OF_MONTH 等各种表示时间的字段。
@Testpublic void test6() { LocalDate localDate = LocalDate.now(); int year = localDate.get(ChronoField.YEAR);//得到年份 int month = localDate.get(ChronoField.MONTH_OF_YEAR);//得到月份 int day = localDate.get(ChronoField.DAY_OF_MONTH);//得到当月中第几天 int weekOfMonth = localDate.get(ChronoField.ALIGNED_WEEK_OF_MONTH);//得到当月的第几周 System.out.println("year:"+year+",month:"+month+",day:"+day+",weekOfMonth:"+weekOfMonth);}
getYear()、getMonthValue() 、getDayOfMonth()、getDayOfWeek()、getDayOfYear()
@Testpublic void test13() { LocalDate d1 = LocalDate.of(2023, 11, 23); int year = d1.getYear();//年份:023 int monthValue = d1.getMonthValue();//月份:11 int dayOfMonth = d1.getDayOfMonth();//当月第几天:23 int dayOfWeek = d1.getDayOfWeek().getValue();//当前周第几天:4 int dayOfYear = d1.getDayOfYear();//当前年第几天:327}
LocalDate的parse()用于从字符串值创建LocalDate的实例。这个方法需要一个参数,即要解析的字符串。该字符串不能为空。此方法返回的是从作为参数传递的字符串值获得的LocalDate实例。
@Testpublic void test7() { LocalDate parse = LocalDate.parse("2023-11-23", DateTimeFormatter.ISO_DATE); LocalDate parse1 = LocalDate.parse("2023-11-23"); System.out.println(parse1.equals(parse));//输出结果:true}
LocalDate的format()方法的功能是将日期进行格式化,使用指定的格式化程序。具体来说,这个方法接受一个DateTimeFormatter对象作为参数,这个对象定义了一个日期时间的格式。然后,这个方法会返回一个字符串,该字符串表示按照指定格式化程序格式化的日期。例如,如果我们有一个LocalDate对象代表着2019年5月8日的日期,我们可以使用format方法将它格式化为"MMM dd, yyyy"的格式,即"May 08, 2019"。
@Testpublic void test8() { LocalDate now = LocalDate.now(); String format = now.format(DateTimeFormatter.ISO_DATE); String format1 = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); System.out.println(format);//输出结果:2023-11-23 System.out.println(format1);//输出结果:2023/11/23}
LocalDate.atTime(hour, minute)的功能是将给定的日期与特定时间进行组合,生成一个LocalDateTime对象。具体来说,这个方法可以将日期部分和时间部分进行组合。例如,如果你有一个LocalDate对象表示今天的日期,并且你想在下午3点钟添加30分钟的时间,你可以使用atTime方法来实现这个功能。
@Testpublic void test9(){ LocalDate now = LocalDate.now(); LocalDateTime localDateTime = now.atTime(13, 30,59); String format = localDateTime.format(DateTimeFormatter.ISO_DATE_TIME); System.out.println(format);//输出结果:2023-11-23T13:30:59}
LocalDate.compareTo() 用于比较两个日期对象。具体来说,这个方法将此日期与另一个日期进行比较。如果此日期在时间上大于、等于或小于指定日期,则分别返回正整数、零或负整数。
@Testpublic void test10() { LocalDate t1 = LocalDate.of(2023, 2, 1);//定义一个日期:2023-02-01 LocalDate t2 = LocalDate.of(2023, Month.FEBRUARY, 2);//定义一个日期:2023-02-02 int i = t2.compareTo(t1);//如果t2>t1,,返回正数;如果t2=t1,返回0;如果t2<t1,返回负数;System.out.println(i);//}
LocalDate.datesUntil(...) 用于计算从当前日期到指定日期之间的日期范围。该方法返回一个表示该日期范围的流(Stream)。具体来说,datesUntil(LocalDate endExclusive) 重载形式接受一个终止日期参数,并返回从调用 datesUntil() 方法的 LocalDate 对象(起始日期)到终止日期之前的所有日期的流。
@Testpublic void test11() { LocalDate d1 = LocalDate.of(2023, 2, 26); LocalDate d2 = LocalDate.of(2023, 3, 26); Stream<LocalDate> stream = d1.datesUntil(d2); stream.forEach(System.out::println);//注意:输出结果不包含结束日期 Stream<LocalDate> stream1 = d1.datesUntil(d2, Period.ofDays(5));//输出的日期之间的间隔是5天 stream1.forEach(System.out::println);}
LocalDate.from(...) 用于从给定的 TemporalAccessor 对象创建 LocalDate 的实例。TemporalAccessor 是Java时间日期API中的一个接口,它提供了对日期和时间信息的访问权限,LocalDate、LocalDateTime等都实现了该接口;
@Testpublic void test12(){ LocalDateTime nowTime = LocalDateTime.now(); LocalDate from = LocalDate.from(nowTime); String format = from.format(DateTimeFormatter.ISO_DATE); System.out.println(format);}
LocalDate类的isAfter()和isBefore()方法分别用于检查一个日期是否在另一个日期之后或之前。
具体来说:
@Testpublic void test14() { LocalDate d1 = LocalDate.of(2023, 11, 23); LocalDate d2 = LocalDate.of(2023, 11, 24); boolean after = d1.isAfter(d2); System.out.println(after);//输出结果:false boolean before = d1.isBefore(d2); System.out.println(before);//输出结果:true}
LocalDate.isLeapYear() 用于判断给定的年份是否为闰年。闰年的判断规则是这样的:如果年份能被4整除但不能被100整除,或者能被400整除,那么这个年份就是闰年。
@Testpublic void test15() { LocalDate d1 = LocalDate.of(2020, 11, 23); LocalDate d2 = LocalDate.of(2023, 11, 24); boolean after = d1.isLeapYear(); System.out.println(after);//输出结果:true boolean before = d2.isLeapYear(); System.out.println(before);//输出结果:false}
LocalDate的lengthOfMonth()方法用于获取此LocalDate表示的月份的长度,即该月份的天数。而lengthOfYear()方法则用于获取此LocalDate表示的年份的长度,即该年份的总天数。这两个方法都是用于计算日期时间的长度,方便进行日期的计算和比较。
@Testpublic void test16() { LocalDate d1 = LocalDate.of(2020, 2, 23); int i = d1.lengthOfYear(); System.out.println(i);//输出结果:366 int j = d1.lengthOfMonth(); System.out.println(j);//输出结果:29}
这些方法都是Java中LocalDate类的方法,用于进行日期减法操作,返回一个新的LocalDate对象,表示减去指定时间间隔后的日期。
@Testpublic void test17() { LocalDate d1 = LocalDate.of(2023, 11, 23); LocalDate minus = d1.minus(Period.ofDays(3));//当前日期+3天 String format = minus.format(DateTimeFormatter.ISO_DATE); System.out.println(format);//输出结果:2023-11-20 LocalDate minus2 = d1.minusDays(3);//当前日期减去3天 String format2 = minus2.format(DateTimeFormatter.ISO_DATE); System.out.println(format2);//输出结果:2023-11-20 LocalDate minus3 = d1.minusMonths(1);//当前日期减去1月 String format3 = minus3.format(DateTimeFormatter.ISO_DATE); System.out.println(format3);//输出结果:2023-10-23 LocalDate minus4 = d1.minusWeeks(1);//当前日期减去1周 String format4 = minus4.format(DateTimeFormatter.ISO_DATE); System.out.println(format4);//输出结果:2023-11-16 LocalDate minus5 = d1.minusYears(1);//当前日期减去1年 String format5 = minus5.format(DateTimeFormatter.ISO_DATE); System.out.println(format5);//输出结果:2022-11-23}
LocalDate类的plus(...)方法是一个通用方法,用于在给定时间单位上增加日期。具体的单位可以通过传递一个ChronoUnit对象来指定,例如plusDays(int days)、plusMonths(int months)、plusWeeks(int weeks)、plusYears(int years)等。
这些方法用于增加LocalDate对象的日期。例如:
需要注意的是,这些方法返回的是一个新的LocalDate对象,而不是修改原有的对象。因此,需要将结果赋值给一个变量来使用增加后的日期。
@Testpublic void test17() { LocalDate d1 = LocalDate.of(2023, 11, 23); LocalDate plus = d1.plus(Period.ofDays(3));//当前日期+3天 String format = plus.format(DateTimeFormatter.ISO_DATE); System.out.println(format);//输出结果:2023-11-26 LocalDate plus2 = d1.plusDays(3);//当前日期+3天 String format2 = plus2.format(DateTimeFormatter.ISO_DATE); System.out.println(format2);//输出结果:2023-11-26 LocalDate plus3 = d1.plusMonths(1);//当前日期+1月 String format3 = plus3.format(DateTimeFormatter.ISO_DATE); System.out.println(format3);//输出结果:2023-12-23 LocalDate plus4 = d1.plusWeeks(1);//当前日期+1周 String format4 = plus4.format(DateTimeFormatter.ISO_DATE); System.out.println(format4);//输出结果:2023-11-30 LocalDate plus5 = d1.plusYears(1);//当前日期+1年 String format5 = plus5.format(DateTimeFormatter.ISO_DATE); System.out.println(format5);//输出结果:2024-11-23}
LocalDate.toEpochDay()的功能是将LocalDate对象转换为自1970年1月1日以来的天数。这个方法返回的是一个长整型(long)的值,它将此本地日期与指定的时间和作为参数传递的偏移量相结合,以计算epoch-second值,该值是从1970-01-01T00:00:00Z开始经过的秒数。
LocalDate.toEpochSecond(LocalTime time, ZoneOffset offset)的功能是将此本地日期与指定的时间和作为参数传递的偏移量相结合,以计算epoch-second值。这个方法接受两个参数,time和offset,它们是本地时间和区域偏移。该方法返回一个长整型(long)的值,表示自1970-01-01T00:00:00Z以来的秒数。
@Testpublic void test19() { LocalDate d1 = LocalDate.of(2023, 11, 23); long epochDay = d1.toEpochDay();//自1970-01-01年到当前日期的天数 System.out.println(epochDay); long epochSecond = d1.toEpochSecond(LocalTime.now(), ZoneOffset.ofHours(8));//自1970-01-01到当前日期的秒数;中国位于东8区,区域偏移量为+8 LocalDate localDate = LocalDate.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault());//把得到秒数再转换为locaDate System.out.println(localDate.equals(d1));//输出结果为true}
LocalDate.with(...)参数是一个 TemporalAdjuster,那么 with 方法会使用传递的调整器作为参数来调整此日期时间,并在调整后,返回调整后的日期时间的副本。
TemporalAdjuster是一个Java 8中引入的日期时间API,用于执行复杂的日期操作。它是一个函数式接口,可以在Temporal对象上执行操作,例如获得下一个星期日、当月的最后一天或下一年的第一天。
TemporalAdjuster有几个预定义的实现类,包括LocalDate、LocalDateTime和TemporalAdjuster接口本身。这些实现类可以用于调整Temporal对象的日期和时间。
使用TemporalAdjuster可以非常方便地执行各种日期操作,例如:
获取下一个星期日的日期。
获取当月的最后一天的日期。
获取下一年的第一天的日期。
获取某个日期之后的第N天、第N个星期或第N个月之后的日期。
获取某个日期和时间之后的下一个工作日、下一个周末或下一个公众假日。
@Testpublic void test20() { UnaryOperator<LocalDate> unaryOperator = item -> item.minusDays(1);//日期调节逻辑:减去1天 TemporalAdjuster temporalAdjuster = TemporalAdjusters.ofDateAdjuster(unaryOperator);//构造日期调节器类 LocalDate localDate1 = LocalDate.of(2023, 11, 22);//日期:2023-11-22 LocalDate localDate2 = localDate1.with(temporalAdjuster);//执行调节逻辑,并返回调节后结果 String dateStr2 = localDate2.format(DateTimeFormatter.ISO_DATE); System.out.println(dateStr2);//输出结果:2023-11-21}
LocalDate类中的withDayOfMonth(...)和withDayOfYear(...)方法用于调整日期的天数。
withDayOfMonth(int dayOfMonth)方法接受一个整数参数,表示月份中的某一天。该方法将此日期调整为给定日期的月份中的指定天数,并返回一个新的日期对象。例如,如果当前日期是2023年3月10日,调用withDayOfMonth(15)将返回一个新的日期对象,表示2023年3月15日。
withDayOfYear(int dayOfYear)方法接受一个整数参数,表示一年中的某一天。该方法将此日期调整为给定年份中的指定天数,并返回一个新的日期对象。例如,如果当前日期是2023年3月10日,调用withDayOfYear(150)将返回一个新的日期对象,表示2023年7月10日(因为7月有31天,所以150减去3月的剩余天数)。
这两个方法都返回一个新的日期对象,不会修改原始的LocalDate对象。这些方法可以用于执行各种日期调整操作,例如计算下个月的第一天或上个月的最后一天等。
@Testpublic void test21() { LocalDate d1 = LocalDate.of(2023, 11, 22);//日期:2023-11-22 LocalDate d2 = d1.withDayOfMonth(1); String format = d2.format(DateTimeFormatter.ISO_DATE); System.out.println(format);//输出结果:2023-11-01 LocalDate localDate3 = d1.withDayOfYear(1); String format2 = localDate3.format(DateTimeFormatter.ISO_DATE); System.out.println(format2);//输出结果:2023-01-01}
LocalDate.atStartOfDay() 返回一个 LocalDateTime 实例,该实例表示给定日期的午夜时分。具体来说,它会把日期部分设为当前日期的开始时间(24小时制),时间部分设为 00:00:00。例如,如果今天是2023年6月24日,那么 LocalDate.now().atStartOfDay() 将返回一个表示2023年6月24日00:00:00的 LocalDateTime 对象。
@Testpublic void test22() { LocalDate d= LocalDate.of(2023, 11, 22); LocalDateTime localDateTime = d.atStartOfDay(); String format = localDateTime.format(DateTimeFormatter.ISO_DATE_TIME); System.out.println(format);//输出结果:2023-11-22T00:00:00}
适用场景
本文链接:http://www.28at.com/showinfo-26-71936-0.html深入了解Java 8 新特性-日期时间API之LocalDate类
声明:本网页内容旨在传播知识,不代表本站观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
下一篇:Ref的使用,你学会了吗?