嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
本文编写的单元测试是基于java11,具体的版本号是:11.0.19
LocalDateTime 是 Java 8 中引入的一个新的日期时间 API,它表示一个没有时区的日期时间对象,是不可变且线程安全的。LocalDateTime 通常用于需要同时表示日期和时间,但不涉及时区的场景。
LocalDateTime、LocalDate和LocalTime都是Java中用于表示日期和时间的数据类型,但它们在功能和使用上有一些重要的区别。
功能:
使用场景:
功能:
使用场景
LocalDateTime#now() 用于获取当前的日期和时间,不包含时区信息。
@Test
public void test() {
LocalDateTime now = LocalDateTime.now();
String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(format);//当前日期和时间:2023-11-27 11:23:54
}
@Test
public void test2() {
LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 27, 11, 27, 56);
System.out.println(localDateTime);//输出结果:2023-11-27T11:27:56
LocalDate localDate = LocalDate.of(2023, 11, 27);
LocalTime localTime = LocalTime.of(11, 27, 56);
LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime);
System.out.println(localDateTime1);//输出结果:2023-11-27T11:27:56
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(Instant.ofEpochSecond(61), ZoneId.systemDefault());
System.out.println(localDateTime2);//输出结果:1970-01-01T08:01:01
LocalDateTime localDateTime3 = LocalDateTime.ofEpochSecond(61, 0, ZoneOffset.ofHours(8));
System.out.println(localDateTime3);//输出结果:1970-01-01T08:01:01
}
LocalDateTime#from(...)用于从给定的日期时间对象中创建一个新的LocalDateTime实例。这个方法接受一个Object类型的参数,这个对象需要是以下类型之一:
当给定的日期时间对象为以上所列出的类型之一时,LocalDateTime#from(...)方法会尝试从中提取日期和时间信息,并创建一个新的LocalDateTime实例。如果给定的对象无法转换为LocalDateTime,那么这个方法会抛出一个DateTimeException异常。
这个方法的使用场景通常是在需要将一个日期时间对象转换为LocalDateTime,以便进行后续的日期和时间运算或处理。例如,你可能从数据库中获取了一个日期时间戳,然后你需要将这个日期时间戳转换为LocalDateTime,以便进行进一步的计算或处理。或者,你可能需要从一个具有特定时区的日期时间对象中创建一个没有时区的LocalDateTime。
@Test
public void test3() {
LocalDateTime localDateTime = LocalDateTime.parse("2023-11-2711:36:56", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime from = LocalDateTime.from(localDateTime);
System.out.println(from);//输出结果:2023-11-2711:36:56
}
LocalDateTime#parse(...) 用于将字符串解析为 LocalDateTime 对象的函数。该方法使用一个字符串作为输入,并根据该字符串的内容创建一个新的 LocalDateTime 对象。
在使用该方法时,该字符串必须符合 ISO 8601 格式,例如 "2019-01-01T12:00:00",另外还需要注意时区的问题。如果字符串中没有指定时区信息,那么解析出来的 LocalDateTime 对象将是本地时区的时间。如果需要指定时区,可以使用 ZoneId 类的 of 方法来创建时区对象,然后使用 LocalDateTime.atZone 方法将 LocalDateTime 对象转换为 ZonedDateTime 对象,最后再使用 ZonedDateTime.toLocalDateTime 方法将其转换为指定时区的 LocalDateTime 对象。
@Test
public void test4() {
LocalDateTime localDateTime = LocalDateTime.parse("2023-11-2711:36:56", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(localDateTime);//输出结果:2023-11-2711:36:56
}
LocalDateTime#isSupported() 用于检查是否支持特定的单位或字段。该方法接受一个参数,可以是 TemporalUnit 或 TemporalField 对象,用于指定要检查的单位或字段。如果支持,方法将返回 true;如果不支持,方法将返回 false。
使用场景:
@Test
public void test5() {
LocalDateTime now = LocalDateTime.now();
boolean supported = now.isSupported(ChronoUnit.YEARS);
boolean supported1 = now.isSupported(ChronoField.DAY_OF_YEAR);
System.out.println(supported);//输出结果:true
System.out.println(supported1);//输出结果:true
}
LocalDateTime#range(...) 用于获取LocalDateTime对象指定字段的有效值范围,返回值是一个ValueRange对象,range对象表示字段的最小和最大有效值。此日期时间用于提高返回范围的准确性。如果由于不支持该字段或其他原因而无法返回范围,则会引发异常。
@Test
public void test6() {
LocalDateTime now = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
ValueRange range = now.range(ChronoField.DAY_OF_MONTH);
long maximum = range.getMaximum();
long minimum = range.getMinimum();
System.out.println(maximum);//输出结果:29
System.out.println(minimum);//输出结果:1
LocalDateTime now2 = LocalDateTime.of(2023, 2, 1, 12, 18, 56);
ValueRange range2 = now2.range(ChronoField.DAY_OF_MONTH);
long maximum2 = range2.getMaximum();
long minimum2 = range2.getMinimum();
System.out.println(maximum2);//输出结果:28
System.out.println(minimum2);//输出结果:1
}
@Test
public void test7() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
int year = localDateTime.get(ChronoField.YEAR);
System.out.println(year);//输出结果:2020
int month = localDateTime.get(ChronoField.MONTH_OF_YEAR);
System.out.println(month);//输出结果:2
long yearLong = localDateTime.getLong(ChronoField.YEAR);
System.out.println(yearLong);//输出结果:2020
long monthLong = localDateTime.getLong(ChronoField.MONTH_OF_YEAR);
System.out.println(monthLong);//输出结果:2
int year1 = localDateTime.getYear();
System.out.println(year1);//输出结果:2020
int monthValue = localDateTime.getMonthValue();
System.out.println(monthValue);//输出结果:2
int dayOfMonth = localDateTime.getDayOfMonth();
System.out.println(dayOfMonth);//输出结果:1
int dayOfYear = localDateTime.getDayOfYear();
System.out.println(dayOfYear);//输出结果:32
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
int dayOfWeekValue = dayOfWeek.getValue();
System.out.println(dayOfWeekValue);//输出结果:6
int hour = localDateTime.getHour();
System.out.println(hour);//输出结果:12
int minute = localDateTime.getMinute();
System.out.println(minute);//输出结果:18
int second = localDateTime.getSecond();
System.out.println(second);//输出结果:56
}
@Test
public void test8() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localDate);//输出结果:2020-02-01
System.out.println(localTime);//输出结果:12:18:56
}
上述这些方法可以在不改变日期和时间的其他部分的情况下,对日期和时间的特定部分进行修改和操作。具体来说:
@Test
public void test9() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
TemporalAdjuster temporalAdjuster = item -> item.plus(1, ChronoUnit.HOURS);
LocalDateTime localDateTime1 = localDateTime.with(temporalAdjuster);
System.out.println(localDateTime1);//输出结果:2020-02-01T13:18:56
LocalDateTime localDateTime2 = localDateTime.with(ChronoField.HOUR_OF_DAY, 1);
System.out.println(localDateTime2);//输出结果:2020-02-01T01:18:56
LocalDateTime localDateTime3 = localDateTime.withYear(2023);
System.out.println(localDateTime3);//输出结果:2023-02-01T12:18:56
LocalDateTime localDateTime4 = localDateTime.withMonth(1);
System.out.println(localDateTime4);//输出结果:2020-01-01T12:18:56
LocalDateTime localDateTime5 = localDateTime.withDayOfMonth(10);
System.out.println(localDateTime5);//输出结果:2020-02-10T12:18:56
LocalDateTime localDateTime6 = localDateTime.withHour(18);
System.out.println(localDateTime6);//输出结果:2020-02-01T18:18:56
LocalDateTime localDateTime7 = localDateTime.withMinute(30);
System.out.println(localDateTime7);//输出结果:2020-02-01T12:30:56
LocalDateTime localDateTime8 = localDateTime.withSecond(59);
System.out.println(localDateTime8);//输出结果:2020-02-01T12:18:59
}
LocalDateTime#truncatedTo()用于将当前LocalDateTime对象的时间部分截断到给定的时间单位。
功能作用:
使用场景:
@Test
public void test10() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
LocalDateTime localDateTime1 = localDateTime.truncatedTo(ChronoUnit.DAYS);
System.out.println(localDateTime1);//输出结果:2020-02-01T00:00
}
上述方法,主要用于在现有的日期时间对象上增加指定的时间单位或量。
具体如下:
使用场景:
@Test
public void test11() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
LocalDateTime localDateTime1 = localDateTime.plus(Period.ofDays(3));
LocalDateTime localDateTime2 = localDateTime.plus(3, ChronoUnit.DAYS);
System.out.println(localDateTime1);//输出结果:2020-02-04T12:18:56
System.out.println(localDateTime2);//输出结果:2020-02-04T12:18:56
LocalDateTime localDateTime3 = localDateTime.plusYears(1);
System.out.println(localDateTime3);//输出结果:2021-02-01T12:18:56
LocalDateTime localDateTime4 = localDateTime.plusMonths(1);
System.out.println(localDateTime4);//输出结果:2020-03-01T12:18:56
LocalDateTime localDateTime5 = localDateTime.plusWeeks(1);
System.out.println(localDateTime5);//输出结果:2020-02-08T12:18:56
LocalDateTime localDateTime6 = localDateTime.plusDays(10);
System.out.println(localDateTime6);//输出结果:2020-02-11T12:18:56
LocalDateTime localDateTime7 = localDateTime.plusHours(3);
System.out.println(localDateTime7);//输出结果:2020-02-01T15:18:56
LocalDateTime localDateTime8 = localDateTime.plusMinutes(12);
System.out.println(localDateTime8);//输出结果:2020-02-01T12:30:56
LocalDateTime localDateTime9 = localDateTime.plusSeconds(4);
System.out.println(localDateTime9);//输出结果:2020-02-01T12:19
}
上述这些方法,用于对日期和时间的减法操作,需要注意的是,这些方法的计算结果值超过限制时可能会抛出DateTimeException异常。
具体如下:
@Test
public void test12() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
LocalDateTime localDateTime1 = localDateTime.minus(Period.ofDays(3));
LocalDateTime localDateTime2 = localDateTime.minus(3, ChronoUnit.DAYS);
System.out.println(localDateTime1);//输出结果:2020-01-29T12:18:56
System.out.println(localDateTime2);//输出结果:2020-01-29T12:18:56
LocalDateTime localDateTime3 = localDateTime.minusYears(1);
System.out.println(localDateTime3);//输出结果:2019-02-01T12:18:56
LocalDateTime localDateTime4 = localDateTime.minusMonths(1);
System.out.println(localDateTime4);//输出结果:2020-01-01T12:18:56
LocalDateTime localDateTime5 = localDateTime.minusWeeks(1);
System.out.println(localDateTime5);//2020-01-25T12:18:56
LocalDateTime localDateTime6 = localDateTime.minusDays(10);
System.out.println(localDateTime6);//输出结果:2020-01-22T12:18:56
LocalDateTime localDateTime7 = localDateTime.minusHours(3);
System.out.println(localDateTime7);//输出结果:2020-02-01T09:18:56
LocalDateTime localDateTime8 = localDateTime.minusMinutes(12);
System.out.println(localDateTime8);//输出结果:2020-02-01T12:06:56
LocalDateTime localDateTime9 = localDateTime.minusSeconds(4);
System.out.println(localDateTime9);//输出结果:2020-02-01T12:18:52
}
LocalDateTime#query()接受一个TemporalQuery作为参数,用于查询此LocalDateTime。查询的结果会根据传递的查询逻辑来决定。通常在需要基于特定的查询逻辑处理日期和时间的情况下使用。传递给查询方法的逻辑是通过TemporalQuery对象定义的。因此,这个方法在使用时需要结合具体的查询需求和TemporalQuery的实现来使用。
@Test
public void test13() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
TemporalQuery temporalQuery = item -> item.get(ChronoField.YEAR);
Integer year = localDateTime.query(temporalQuery);
System.out.println(year);//输出结果:2020
}
LocalDateTime#until() 方法用于计算两个 LocalDateTime 对象之间的时间量,并以指定的 TemporalUnit 为单位返回结果。这个方法返回一个整数,表示两个 LocalDateTime 对象之间完整的时间单位数。
功能作用:
使用场景:
@Test
public void test14() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
long until = localDateTime.until(LocalDateTime.of(2023, 2, 1, 12, 30, 56), ChronoUnit.YEARS);
System.out.println(until);//输出结果:3
}
LocalDateTime#format(...)用于将当前 LocalDateTime 对象格式化为指定的日期时间字符串。
@Test
public void test15() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(format);//输出结果:2020-02-01 12:18:56
}
LocalDateTime#atOffset() 主要是用于合并当前LocalDateTime对象与给定的偏移量。具体来说,该方法创建并返回一个 OffsetDateTime 对象,该对象将保存将当前LocalDateTime 与给定偏移量合并后的值。主要在需要对LocalDateTime对象进行偏移量调整的情况下使用。例如,如果你需要根据当前的LocalDateTime创建一个在特定偏移量(如一小时,一天)后的日期时间,就可以通过使用LocalDateTime#atOffset()方法来实现。这个方法的使用非常灵活,你可以根据需要选择不同的偏移量进行合并,得到的 OffsetDateTime 对象可以用于进一步的日期时间计算或展示等操作。
@Test
public void test16() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//输出结果:2020-02-01T12:18:56+08:00
}
LocalDateTime#atZone()用于将给定的LocalDateTime对象合并到给定的时区,从而创建一个ZonedDateTime对象。该方法是一个非静态方法,只能通过类对象访问。通过该方法,可以将在不同时区存储的日期时间数据统一到一个时区中进行处理和比较。
使用场景:
@Test
public void test17() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
System.out.println(zonedDateTime);//输出结果:2020-02-01T12:18:56+08:00[Asia/Shanghai]
}
@Test
public void test18() {
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56);
LocalDateTime localDateTime2 = LocalDateTime.of(2023, 2, 1, 12, 18, 56);
int compareTo = localDateTime2.compareTo(localDateTime);
System.out.println(compareTo);//输出结果:3
boolean before = localDateTime2.isBefore(localDateTime);
System.out.println(before);//输出结果:false
boolean after = localDateTime2.isAfter(localDateTime);
System.out.println(after);//输出结果:true
boolean equal = localDateTime2.isEqual(localDateTime);
System.out.println(equal);//输出结果:false
}
在使用 LocalDateTime 时,有一些注意事项需要特别注意,了解这些限制和注意事项可以确保正确有效地使用它: