本文编写的单元测试是基于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 }
LocalDateTime#of(...)、LocalDateTime#ofInstant(...)、LocalDateTime#ofEpochSecond(...)
@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 }
LocalDateTime#get(...)、LocalDateTime#getLong(...)、LocalDateTime#getYear(...)、LocalDateTime#getMonthValue(...)、LocalDateTime#getMonth(...)、LocalDateTime#getDayOfMonth(...)、LocalDateTime#getDayOfYear(...)、LocalDateTime#getDayOfWeek(...)、LocalDateTime#getHour(...)、LocalDateTime#getMinute(...)、LocalDateTime#getSecond(...)、LocalDateTime#getNano(...)
@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 }
LocalDateTime#toLocalDate(...)、LocalDateTime#toLocalTime(...)
@Testpublic 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}
LocalDateTime#with(...)、LocalDateTime#withYear(...)、LocalDateTime#withMonth(...)、LocalDateTime#withDayOfMonth(...)、LocalDateTime#withDayOfYear(...)、LocalDateTime#withHour(...)、LocalDateTime#withMinute(...)、LocalDateTime#withSecond(...)、LocalDateTime#withNano(...)
上述这些方法可以在不改变日期和时间的其他部分的情况下,对日期和时间的特定部分进行修改和操作。具体来说:
@Testpublic 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对象的时间部分截断到给定的时间单位。
功能作用:
使用场景:
@Testpublic 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}
LocalDateTime#plus(...)、LocalDateTime#plusYears(...)、LocalDateTime#plusMonths(...)、LocalDateTime#plusWeeks(...)、LocalDateTime#plusDays(...)、LocalDateTime#plusHours(...)、LocalDateTime#plusMinutes(...)、LocalDateTime#plusSeconds(...)、LocalDateTime#plusNanos(...)
上述方法,主要用于在现有的日期时间对象上增加指定的时间单位或量。
具体如下:
使用场景:
@Testpublic 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}
LocalDateTime#minus(...)、LocalDateTime#minusYears(...)、LocalDateTime#minusMonths(...)、LocalDateTime#minusWeeks(...)、LocalDateTime#minusDays(...)、LocalDateTime#minusHours(...)、LocalDateTime#minusMinutes(...)、LocalDateTime#minusSeconds(...)、LocalDateTime#minusNanos(...)
上述这些方法,用于对日期和时间的减法操作,需要注意的是,这些方法的计算结果值超过限制时可能会抛出DateTimeException异常。
具体如下:
@Testpublic 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的实现来使用。
@Testpublic void test13() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); TemporalQuery<Integer> temporalQuery = item -> item.get(ChronoField.YEAR); Integer year = localDateTime.query(temporalQuery); System.out.println(year);//输出结果:2020}
LocalDateTime#until() 方法用于计算两个 LocalDateTime 对象之间的时间量,并以指定的 TemporalUnit 为单位返回结果。这个方法返回一个整数,表示两个 LocalDateTime 对象之间完整的时间单位数。
功能作用:
使用场景:
@Testpublic 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 对象格式化为指定的日期时间字符串。
@Testpublic 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#atOffset() 主要是用于合并当前LocalDateTime对象与给定的偏移量。具体来说,该方法创建并返回一个 OffsetDateTime 对象,该对象将保存将当前LocalDateTime 与给定偏移量合并后的值。主要在需要对LocalDateTime对象进行偏移量调整的情况下使用。例如,如果你需要根据当前的LocalDateTime创建一个在特定偏移量(如一小时,一天)后的日期时间,就可以通过使用LocalDateTime#atOffset()方法来实现。这个方法的使用非常灵活,你可以根据需要选择不同的偏移量进行合并,得到的 OffsetDateTime 对象可以用于进一步的日期时间计算或展示等操作。
@Testpublic 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对象。该方法是一个非静态方法,只能通过类对象访问。通过该方法,可以将在不同时区存储的日期时间数据统一到一个时区中进行处理和比较。
使用场景:
@Testpublic 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]}
LocalDateTime#compareTo(...)、LocalDateTime#isAfter(...)、LocalDateTime#isBefore(...)、LocalDateTime#isEqual(...)
@Testpublic 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 时,有一些注意事项需要特别注意,了解这些限制和注意事项可以确保正确有效地使用它:
本文链接:http://www.28at.com/showinfo-26-72428-0.html深入了解Java 8 新特性-日期时间API之LocalDateTime类
声明:本网页内容旨在传播知识,不代表本站观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。