LocalDate
Java 8的LocalDate类是Java日期和时间API的一部分,没有时间和时区的概念,是线程安全的,用于表示不包含时间的日期,位于java.time包下。
核心方法
now()
按系统默认的时区来获取当前日期,返回代表当前日期的 LocalDate 实例。
@Test
public void test() {
LocalDate now = LocalDate.now();//当前日期
String format = now.format(DateTimeFormatter.ISO_DATE);
System.out.println(format);//输出结果:2023-11-23 }
of(...)
接受一个年份(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
}
ofEpochDay(...)
用于将给定的Unix时间戳(自1970年1月1日以来的天数)转换为 LocalDate 对象。这个方法返回一个表示该日期的 LocalDate 实例
@Test
public void test3() {
LocalDate localDate2 = LocalDate.ofEpochDay(1);// 假设给定的Unix时间戳为1天
String format = localDate2.format(DateTimeFormatter.ISO_DATE);
System.out.println(format);//输出结果:1970-01-02
}
ofInstant(...)
Instant 是 Java 中的一个时间类,表示一个瞬时的时间点,精确到纳秒。Instant.ofEpochSecond()用于根据秒数(从1970年1月1日00:00:00 UTC开始)创建一个新的 Instant 对象。LocalDate.ofInstant() 可以将给定的 Instant 对象转换为 LocalDate 对象。
@Test
public 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
}
ofYearDay(...)
LocalDate.ofYearDay() 用于创建一个表示某一年中特定天数的 LocalDate 对象。方法接受两个参数:年份和一年中的天数。年份表示自1970年以来的年数,天数表示一年中的第几天。例如,1月1日是第1天,2月15日是第46天。需要注意的是,这个方法并不会对输入的天数进行有效性检查,因此如果输入的天数超出了给定年份的范围(例如,在2月输入了30),那么创建出来的 LocalDate 对象可能不准确。
@Test
public void test5() {
LocalDate localDate = LocalDate.ofYearDay(2023, 2);
String format = localDate.format(DateTimeFormatter.ISO_DATE);
System.out.println(format);//输出结果:2023-01-02
}
get(...)
LocalDate.get(...) 可以获取给定日期的特定部分,如年份、月份或日期。具体来说,如果你调用 LocalDate.get(ChronoField),其中 ChronoField 是 java.time.temporal.ChronoField 的实例,那么就会返回该日期对应的特定部分。ChronoField 是一个枚举类型,包含如 YEAR、MONTH_OF_YEAR、DAY_OF_MONTH 等各种表示时间的字段。
@Test
public 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()
- getYear(): 获取该日期的年份部分。例如,对于日期 "2023-06-24",该方法将返回2023。
- getMonthValue(): 获取该日期的月份部分。例如,对于日期 "2023-06-24",该方法将返回6。
- getDayOfMonth(): 获取该日期中的月份中的日期部分。例如,对于日期 "2023-06-24",该方法将返回24。
- getDayOfWeek(): 获取该日期是星期几的信息。该方法将返回一个枚举类型的值,如MONDAY、TUESDAY等。
- getDayOfYear(): 获取该日期是当年的第几天。例如,对于日期 "2023-06-24",该方法将返回175。
@Test
public 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
}
parse(...)
LocalDate的parse()用于从字符串值创建LocalDate的实例。这个方法需要一个参数,即要解析的字符串。该字符串不能为空。此方法返回的是从作为参数传递的字符串值获得的LocalDate实例。
@Test
public 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
}
format(...)
LocalDate的format()方法的功能是将日期进行格式化,使用指定的格式化程序。具体来说,这个方法接受一个DateTimeFormatter对象作为参数,这个对象定义了一个日期时间的格式。然后,这个方法会返回一个字符串,该字符串表示按照指定格式化程序格式化的日期。例如,如果我们有一个LocalDate对象代表着2019年5月8日的日期,我们可以使用format方法将它格式化为"MMM dd, yyyy"的格式,即"May 08, 2019"。
@Test
public 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
}
atTime(...)
LocalDate.atTime(hour, minute)的功能是将给定的日期与特定时间进行组合,生成一个LocalDateTime对象。具体来说,这个方法可以将日期部分和时间部分进行组合。例如,如果你有一个LocalDate对象表示今天的日期,并且你想在下午3点钟添加30分钟的时间,你可以使用atTime方法来实现这个功能。
@Test
public 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
}
compareTo(...)
LocalDate.compareTo() 用于比较两个日期对象。具体来说,这个方法将此日期与另一个日期进行比较。如果此日期在时间上大于、等于或小于指定日期,则分别返回正整数、零或负整数。
@Test
public 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 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
}
withDayOfMonth(...)、withDayOfYear(...)
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对象。这些方法可以用于执行各种日期调整操作,例如计算下个月的第一天或上个月的最后一天等。
@Test
public 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
}
atStartOfDay()
LocalDate.atStartOfDay() 返回一个 LocalDateTime 实例,该实例表示给定日期的午夜时分。具体来说,它会把日期部分设为当前日期的开始时间(24小时制),时间部分设为 00:00:00。例如,如果今天是2023年6月24日,那么 LocalDate.now().atStartOfDay() 将返回一个表示2023年6月24日00:00:00的 LocalDateTime 对象。
@Test
public 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
}
适用场景
- 日期处理:LocalDate类适用于只需要处理日期的场景,而不考虑时间部分。例如,记录生日、纪念日、账单日等。
- 日期计算:可以使用LocalDate类进行日期的加减运算,例如计算两个日期之间的天数、月数或年数。
- 日期格式化:可以使用LocalDate类和DateTimeFormatter类进行日期的格式化操作,将日期转换为指定的字符串格式。
- 日期时间转换:可以将带有时间的日期转换为不带时间的LocalDate对象,或者将LocalDate对象转换为带有时间的日期时间对象(如LocalDateTime)。