当前位置: 首页 > news >正文

深入了解Java8新特性-日期时间API:OffsetDateTime类

阅读建议

嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概24000多字,预计阅读时间长需要20分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

注意

本文编写的单元测试是基于java11,具体的版本号是:11.0.19

关于OffsetDateTime

OffsetDateTime是Java 8中引入的一个不可变且线程安全的日期时间数据类型,用于表示带有时区偏移的日期和时间。因为它是一种不可变的数据类型,所以在进行比较或传递时不会发生变化。

OffsetDateTime可以表示从本地时间线LocalDateTime到即时时间线Instant之间的日期和时间。两个时间线之间的差异是UTC /格林威治的偏移量,由ZoneOffset表示。在两个时间线之间转换涉及使用从ZoneId访问的ZoneId计算偏移量。在处理带有时区偏移的日期和时间时,使用OffsetDateTime可以方便地表示和操作具有特定时区偏移的日期和时间,避免时区转换带来的问题。

而时区是为了克服时间上的混乱,在1884年在华盛顿召开的一次国际经度会议上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1-12区,西1-12区。每个时区横跨经度15度,时间正好是1小时。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。

中国横跨东五区至东九区5个时区,自西向东可依次分为东六区、东七区、东八区、东九区、东十区。为了使用方便,中国采用首都北京所在的东八区的区时作为全国统一使用时间,也就是北京时间。

核心方法

OffsetDateTime#now()

OffsetDateTime#now()是Java 8中 java.time.OffsetDateTime类的一个非常简单方法,这个方法不需要任何参数,返回表示当前日期和时间的 OffsetDateTime 对象。

@Test
public void test() {OffsetDateTime offsetDateTime = OffsetDateTime.now();System.out.println(offsetDateTime);//输出结果:2023-11-27T18:15:42.924290700+08:00
}

OffsetDateTime#of(...)、OffsetDateTime#ofInstant(...)

OffsetDateTime#of(...)和OffsetDateTime#ofInstant(...)都是用于创建和操作具有偏移量的日期和时间对象的工具,区别在于接受参数类型上:

  • OffsetDateTime#of(...):有多个重载方法,可以接受年、月、日、小时、分钟、秒、纳秒和偏移量创建OffsetDateTime的实例,可以接受一个LocalDateTime实例和偏移量创建OffsetDateTime的实例,也可以接受LocalDate、LocalTime和偏移量,创建OffsetDateTime的实例;当你需要创建一个具有明确日期和时间,并且需要表示与UTC的偏移量的OffsetDateTime对象时,可以使用此方法。例如,如果你正在处理具有特定时间戳的金融交易,或者需要表示在特定时间点上的事件,这个方法可能会非常有用。
  • OffsetDateTime#ofInstant(...): 此方法用于根据指定的Instant和ZoneId创建OffsetDateTime的实例。当你已经有一个表示瞬时时间的Instant对象,并且需要将这个时间与特定的时区关联起来时,可以使用此方法。例如,如果你正在处理全球事件,并且需要根据不同时区来解释和显示时间信息,这个方法会非常有用。或者,如果你正在处理从外部源(如数据库或API)接收的日期和时间信息,并且需要将其转换为本地时区的时间表示,这个方法也可以使用。
@Test
public void test2() {LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 27, 18, 42, 56);//北京属于东八区OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(8));//纽约属于西五区OffsetDateTime offsetDateTime1 = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(-5));System.out.println(offsetDateTime);//输出结果:2023-11-27T18:42:56+08:00Duration between = Duration.between(offsetDateTime, offsetDateTime1);long hours = between.toHours();System.out.println(hours);//以美国纽约时间与中国北京时间相差13个小时,输出结果:13Instant instant = Instant.ofEpochSecond(1L);System.out.println(instant);//输出结果:1970-01-01T00:00:01ZOffsetDateTime offsetDateTime2 = OffsetDateTime.ofInstant(instant, ZoneId.systemDefault());System.out.println(offsetDateTime2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));//输出结果:1970-01-01 08:00:01,这与上面的输出结果相差了8个小时,原因就在于ZoneId.systemDefault()获取了系统默认时区,中国采用东八区时区,因此与格林尼治时间相差了8小时
}

OffsetDateTime#from(...)

OffsetDateTime#from(...)可以将其他类型的日期和时间对象转换为 OffsetDateTime 对象。这个方法接受一个 TemporalAccessor 对象作为参数,并根据该对象中的日期和时间信息创建一个新的 OffsetDateTime 对象。当你需要将其他类型的日期和时间对象转换为 OffsetDateTime 对象时,可以使用这个方法。

@Test
public void test3() {LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 27, 18, 42, 56);ZoneOffset zoneOffset = ZoneOffset.ofHours(8);ZonedDateTime zonedDateTime = localDateTime.atZone(zoneOffset);OffsetDateTime from = OffsetDateTime.from(zonedDateTime);System.out.println(from);//2023-11-27T18:42:56+08:00
}

OffsetDateTime#parse(...)

OffsetDateTime#parse() 的主要功能是将字符串解析为 OffsetDateTime 对象,主要是用于将字符串表示的日期和时间转换为 OffsetDateTime 对象时,它接受一个字符串作为参数,并尝试将其解析为 OffsetDateTime,解析过程会考虑本地时区,并将字符串解析为具有偏移量的日期和时间。

@Test
public void test4() {String dateTimeStr = "2023-11-28T09:45:56+08:00";OffsetDateTime from = OffsetDateTime.parse(dateTimeStr);System.out.println(from);//输出结果:2023-11-28T09:45:56+08:00
}

OffsetDateTime#isSupported(...)

OffsetDateTime#isSupported()用于检查是否支持特定的单位或字段。如果支持,方法将返回 true;如果不支持,方法将返回 false。主要的使用场景:在执行日期时间运算之前,可以使用该方法检查是否支持所使用的单位或字段,以避免因操作不支持的单位或字段而引发异常。

@Test
public void test5() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));boolean supported1 = offsetDateTime.isSupported(ChronoField.YEAR);boolean supported2 = offsetDateTime.isSupported(ChronoUnit.HOURS);System.out.println(supported1);//输出结果:trueSystem.out.println(supported2);//输出结果:true
}

OffsetDateTime#range(...)

OffsetDateTime#range()方法是用于获取特定字段的范围的ValueRange对象。该方法的功能作用是根据作为参数传递的字段,获取该字段的有效值范围。具体来说,该方法接受一个参数,即要查询范围的字段,然后返回一个ValueRange对象,该对象表示该字段的有效值范围。如果此方法不支持该字段,则可能引发异常。

使用场景包括需要确定特定字段的范围和有效值的场景。例如,在数据库查询中,可以使用该方法来获取特定字段的取值范围,从而构建更精确的查询条件。在日期时间处理中,可以使用该方法获取特定日期时间字段的有效范围,以便进行日历计算、时间间隔计算等操作。

需要注意的是,该方法仅对OffsetDateTime对象支持的字段返回ValueRange对象。因此,如果查询的字段不受支持,此方法可能会引发异常。在使用时需要确保查询的字段是受支持的,以避免出现异常情况。

@Test
public void test6() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));ValueRange range = offsetDateTime.range(ChronoField.DAY_OF_MONTH);System.out.println(range.getMinimum());//输出结果:1System.out.println(range.getMaximum());//输出结果:30
}

OffsetDateTime#get(...)、OffsetDateTime#getLong(...)、OffsetDateTime#getOffset(...)、OffsetDateTime#getYear(...)、OffsetDateTime#getMonthValue(...)、OffsetDateTime#getMonth(...)、OffsetDateTime#getDayOfMonth(...)、OffsetDateTime#getDayOfYear(...)、OffsetDateTime#getDayOfWeek(...)、OffsetDateTime#toLocalTime(...)、OffsetDateTime#getHour(...)、OffsetDateTime#getMinute(...)、OffsetDateTime#getSecond(...)、OffsetDateTime#getNano(...)

这些方法主要用于获取OffsetDateTime对象中指定字段的值,需要注意的是,该方法仅对受支持的字段返回有效值,对于不支持的字段可能会引发异常。因此,在使用时需要确保查询的字段是受支持的,以避免出现异常情况。

  • OffsetDateTime#get()方法的功能作用是从该日期时间中获取指定字段的值。它接受一个参数,即要获取的字段,然后返回该字段的值。使用场景包括需要获取日期时间中特定字段的值的情况。例如,在日期时间处理中,可以使用该方法获取日期、时间、时区等信息,以便进行进一步的处理和计算。
  • OffsetDateTime#getLong()方法的功能作用是从该日期时间中获取long形式的指定字段的值。它接受一个参数,即要获取的字段,然后返回该字段的值。使用场景包括需要获取日期时间中特定字段的长整型值的情况。例如,在日期时间处理中,可以使用该方法获取日期、时间等信息,以便进行进一步的处理和计算。
  • OffsetDateTime#getOffset()方法的功能作用是获取该日期的偏移量。它返回一个ZoneOffset对象,表示该日期的偏移量。使用场景包括需要获取日期时间的偏移量的情况。例如,在日期时间处理中,可以使用该方法获取偏移量信息,以便进行日历计算、时间间隔计算等操作。
  • OffsetDateTime#getYear()方法的功能作用是获取该日期的年份。使用场景包括需要获取日期时间的年份的情况。例如,在日期时间处理中,可以使用该方法获取年份信息,以便进行日历计算、时间间隔计算等操作。
  • OffsetDateTime#getMonthValue()方法的功能作用是获取该日期的月份的值。使用场景包括需要获取日期时间的月份的情况。例如,在日期时间处理中,可以使用该方法获取月份信息,以便进行日历计算、时间间隔计算等操作。
  • OffsetDateTime#getMonth()方法的功能作用是获取该日期的月份的名称。它返回一个String对象,表示该月份的名称。使用场景包括需要获取日期时间的月份名称的情况。例如,在日期时间处理中,可以使用该方法获取月份名称信息,以便进行日历显示、报告生成等操作。
  • OffsetDateTime#getDayOfMonth()方法的功能作用是获取该日期的日期的值。使用场景包括需要获取日期时间的日期的的情况。例如,在日期时间处理中,可以使用该方法获取日期信息,以便进行日历计算、时间间隔计算等操作。
  • OffsetDateTime#getDayOfYear()方法的功能作用是获取该日期的年份的第几天。它返回一个int值,表示该日期是当年的第几天。使用场景包括需要确定日期是当年的第几天的情况。例如,在日历程序或报告生成中,可以使用该方法获取日期在一年中的天数信息。
  • OffsetDateTime#getDayOfWeek()方法的功能作用是获取该日期是星期几。它返回一个int值,表示星期几,其中1代表星期天,2代表星期一,以此类推。使用场景包括需要确定日期是星期几的情况。例如,在日历程序或报告生成中,可以使用该方法获取星期信息。
  • OffsetDateTime#toLocalTime()方法的功能作用是将该日期时间转换为LocalTime对象。它返回一个新的LocalTime对象,表示该日期时间的本地时间部分。使用场景包括需要将日期时间转换为LocalTime对象进行进一步处理的情况。例如,在需要只处理时间部分而不涉及日期时,可以使用该方法将日期时间转换为LocalTime对象进行处理。
  • OffsetDateTime#getHour()方法的功能作用是获取该日期时间的时区的的小时数。它返回一个int值,表示小时数。使用场景包括需要确定日期时间的时区的小时数的情况。例如,在时区转换或时间计算中,可以使用该方法获取时区的小时信息。
  • OffsetDateTime#getMinute()方法的功能作用是获取该日期时间的时区的分钟数。它返回一个int值,表示分钟数。
@Test
public void test7() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));int year = offsetDateTime.get(ChronoField.YEAR);System.out.println(year);//输出结果:2023int month = offsetDateTime.get(ChronoField.MONTH_OF_YEAR);System.out.println(month);//输出结果:11int day = offsetDateTime.get(ChronoField.DAY_OF_MONTH);System.out.println(day);//输出结果:28int hour = offsetDateTime.get(ChronoField.HOUR_OF_DAY);System.out.println(hour);//输出结果:9int minutes = offsetDateTime.get(ChronoField.MINUTE_OF_HOUR);System.out.println(minutes);//输出结果:46int second = offsetDateTime.getSecond();System.out.println(second);//输出结果:56int year1 = offsetDateTime.getYear();System.out.println(year1);//输出结果:2023int month1 = offsetDateTime.getMonthValue();System.out.println(month1);//输出结果:11int hour1 = offsetDateTime.getHour();System.out.println(hour1);//输出结果:9int dayOfYear = offsetDateTime.getDayOfYear();int dayOfMonth = offsetDateTime.getDayOfMonth();int dayOfWeek = offsetDateTime.getDayOfWeek().getValue();System.out.println(dayOfYear);//输出结果:332System.out.println(dayOfMonth);//输出结果:28System.out.println(dayOfWeek);//输出结果:2
}

OffsetDateTime#toLocalDateTime(...)、OffsetDateTime#toLocalDate(...)、OffsetDateTime#toLocalTime(...)

  • OffsetDateTime#toLocalDateTime()的功能作用是将 OffsetDateTime 对象转换为 LocalDateTime 对象。使用场景:当你需要将带有时区偏移的日期时间转换为不带有时区偏移的日期时间对象时,可以使用此方法。这在你只需要处理没有时区偏移的日期时间时非常有用。
  • OffsetDateTime#toLocalDate()的功能作用是将 OffsetDateTime 对象转换为 LocalDate 对象,忽略时间部分。使用场景:当你需要将带有时区偏移的日期时间转换为日期部分,并忽略时间部分时,可以使用此方法。例如,在处理日历事件或日期相关操作时,可能只需要日期信息而不需要时间信息。
  • OffsetDateTime#toLocalTime()的功能作用:将 OffsetDateTime 对象转换为 LocalTime 对象,忽略日期部分。使用场景:当你需要将带有时区偏移的时间转换为时间部分,并忽略日期部分时,可以使用此方法。例如,在处理具体时间段或时间相关操作时,可能只需要时间信息而不需要日期信息。

需要注意的是,这些方法都可能抛出 DateTimeException 异常,如果输入的 OffsetDateTime 对象包含无效的日期或时间信息,或者不支持某些字段。因此,在使用这些方法时,需要确保输入的 OffsetDateTime 对象是有效和受支持的。

@Test
public void test8() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));LocalDateTime localDateTime = offsetDateTime.toLocalDateTime();System.out.println(localDateTime);//输出结果:2023-11-28T09:46:56LocalDate localDate = offsetDateTime.toLocalDate();System.out.println(localDate);//输出结果:2023-11-28LocalTime localTime = offsetDateTime.toLocalTime();System.out.println(localTime);//输出结果:09:46:56
}

OffsetDateTime#with(...)、OffsetDateTime#withYear(...)、OffsetDateTime#withMonth(...)、OffsetDateTime#withDayOfMonth(...)、OffsetDateTime#withDayOfYear(...)、OffsetDateTime#withHour(...)、OffsetDateTime#withMinute(...)、OffsetDateTime#withSecond(...)、OffsetDateTime#withNano(...)、OffsetDateTime#withOffsetSameLocal(...)、OffsetDateTime#withOffsetSameInstant(...)

这些方法都允许开发者以特定的粒度(年、月、日、小时、分钟、秒和纳米秒)调整一个给定的OffsetDateTime实例。这些方法使得开发者能够根据特定的需求(如改变日期或时间)来操作和修改日期和时间数据。

具体如下:

  • OffsetDateTime#with(): 该方法用于使用TemporalAdjuster调整此OffsetDateTime,并在调整后返回调整后的OffsetDateTime的副本。使用指定的调整器策略对象进行调整。此OffsetDateTime实例是不可变的,不受此方法调用的影响。
  • OffsetDateTime#withYear(): 该方法返回此OffsetDateTime的副本,其年份按参数中的指定进行了更改。参数为单个year,范围可以从MIN_YEAR到MAX_YEAR。返回的日期带有请求的年份,而不是null。如果年份值无效,将引发DateTimeException。
  • OffsetDateTime#withMonth(): 该方法返回此OffsetDateTime的副本,其月份按参数中的指定进行了更改。参数为单个month,范围从1到12。返回的日期带有请求的月份。
  • OffsetDateTime#withDayOfMonth(): 该方法返回此OffsetDateTime的副本,其日按参数中的指定进行了更改。参数为单个dayOfMonth,范围从1到月份的天数。返回的日期带有请求的日。
  • OffsetDateTime#withDayOfYear(): 该方法返回此OffsetDateTime的副本,其一年中的日子按参数中的指定进行了更改。参数为单个dayOfYear,范围从1到365或366(取决于年份是否为闰年)。返回的日期带有请求的日。
  • OffsetDateTime#withHour(): 该方法返回此OffsetDateTime的副本,其小时按参数中的指定进行了更改。参数为单个hour,范围从0到23。返回的日期带有请求的小时。
  • OffsetDateTime#withMinute(): 该方法返回此OffsetDateTime的副本,其分钟按参数中的指定进行了更改。参数为单个minute,范围从0到59。返回的日期带有请求的分钟。
  • OffsetDateTime#withSecond(): 该方法返回此OffsetDateTime的副本,其秒数按参数中的指定进行了更改。参数为单个second,范围从0到59。返回的日期带有请求的秒数。
  • OffsetDateTime#withNano(): 该方法返回此OffsetDateTime的副本,其纳米秒按参数中的指定进行了更改。参数为单个nanoOfSecond,范围从0到999999999。返回的日期带有请求的纳米秒数。
  • OffsetDateTime#withOffsetSameLocal(): 该方法返回一个具有相同本地时间的OffsetDateTime,但时间偏移量可能不同。使用指定的偏移量对此OffsetDateTime进行修改,并返回修改后的实例。
  • OffsetDateTime#withOffsetSameInstant(): 该方法返回一个具有相同即时时间的OffsetDateTime,但可能具有不同的本地时间。使用指定的偏移量对此OffsetDateTime进行修改,并返回修改后的实例。

需要注意的是,这些方法大多数情况下不会改变原始的OffsetDateTime实例,而是返回一个新的实例,原始实例依然保持不变。这是由于Java中大多数不可变类(如String、Integer等)的设计思路是一致的。

@Test
public void test9() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));OffsetDateTime with = offsetDateTime.with(ChronoField.MONTH_OF_YEAR, 10);System.out.println(with);//输出结果:2023-10-28T09:46:56+08:00TemporalAdjuster temporalAdjuster = item -> item.plus(1, ChronoUnit.HOURS);OffsetDateTime with1 = offsetDateTime.with(temporalAdjuster);System.out.println(with1);//输出结果:2023-11-28T10:46:56+08:00OffsetDateTime offsetDateTime1 = offsetDateTime.withYear(2020);System.out.println(offsetDateTime1);//输出结果:2020-11-28T09:46:56+08:00OffsetDateTime offsetDateTime2 = offsetDateTime.withMonth(2);System.out.println(offsetDateTime2);//输出结果:2023-02-28T09:46:56+08:00OffsetDateTime offsetDateTime3 = offsetDateTime.withDayOfMonth(25);System.out.println(offsetDateTime3);//输出结果:2023-11-25T09:46:56+08:00OffsetDateTime offsetDateTime4 = offsetDateTime.withOffsetSameInstant(ZoneOffset.ofHours(-13));System.out.println(offsetDateTime4);//输出结果:2023-11-27T12:46:56-13:00,什么意思呢?意思是:同一时刻北京时间是2023-11-28T09:46:56+08:00,而同一时刻的纽约时间是:2023-11-27T12:46:56-13:00OffsetDateTime offsetDateTime5 = offsetDateTime.withOffsetSameLocal(ZoneOffset.ofHours(-13));System.out.println(offsetDateTime5);//输出结果:2023-11-28T09:46:56-13:00
}

OffsetDateTime#truncatedTo(...)

OffsetDateTime#truncatedTo()用于将当前OffsetDateTime对象的时间部分截断到给定的时间单位,例如分钟、小时、天等。截断后的OffsetDateTime对象将不再包含被截断单位之前的时间信息。

使用场景:

  • 需要截断日期时间时:在一些特定的应用场景中,可能需要对日期时间进行截断操作。例如,在进行统计或数据分析时,可能只需要日期时间中的某一部分信息,而不需要保留完整的时间信息。在这种情况下,可以使用OffsetDateTime#truncatedTo()方法将日期时间截断到所需的时间单位。
  • 需要进行时间运算时:在进行时间运算时,如计算两个日期时间之间的差值或进行日期的加减运算等,可以将日期时间截断到分钟或小时级别,以避免因毫秒级的时间差异而产生误差。例如,可以使用OffsetDateTime#truncatedTo()方法将日期时间截断到分钟级别,然后进行加减运算,以实现精确到分钟的日期时间计算。
@Test
public void test10() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));System.out.println(offsetDateTime);//输出结果:2023-11-28T09:46:56+08:00OffsetDateTime offsetDateTime1 = offsetDateTime.truncatedTo(ChronoUnit.DAYS);System.out.println(offsetDateTime1);//输出结果:2023-11-28T00:00+08:00
}

OffsetDateTime#plus(...)、OffsetDateTime#plusYears(...)、OffsetDateTime#plusMonths(...)、OffsetDateTime#plusWeeks(...)、OffsetDateTime#plusDays(...)、OffsetDateTime#plusHours(...)、OffsetDateTime#plusMinutes(...)、OffsetDateTime#plusSeconds(...)、OffsetDateTime#plusNanos(...)

OffsetDateTime#plus()可以在当前OffsetDateTime对象的基础上加上指定的时间长度。这个方法有很多重载版本,可以支持不同的时间单位,包括年(Years)、月(Months)、周(Weeks)、天(Days)、小时(Hours)、分钟(Minutes)、秒(Seconds)和纳秒(Nanos)。这些方法都返回一个新的OffsetDateTime对象,表示添加了指定时间长度后的日期和时间。它们不会改变原始的OffsetDateTime对象。如果添加的时间长度为负数,则会相应地减去时间长度。注意,如果程序超出支持的数据和时间范围,则可能会引发DateTimeException异常。

具体如下:

  • OffsetDateTime#plusYears(long years):在当前OffsetDateTime对象的基础上加上指定的年数。这个方法接受一个长整型参数,表示要添加的年数。使用场景包括需要计算未来某一时间点在特定年数后的日期和时间。
  • OffsetDateTime#plusMonths(long months):在当前OffsetDateTime对象的基础上加上指定的月数。这个方法接受一个长整型参数,表示要添加的月数。使用场景包括需要计算未来某一时间点在特定月数后的日期和时间。
  • OffsetDateTime#plusWeeks(long weeks):在当前OffsetDateTime对象的基础上加上指定的周数。这个方法接受一个长整型参数,表示要添加的周数。使用场景包括需要计算未来某一时间点在特定周数后的日期和时间。
  • OffsetDateTime#plusDays(long days):在当前OffsetDateTime对象的基础上加上指定的天数。这个方法接受一个长整型参数,表示要添加的天数。使用场景包括需要计算未来某一时间点在特定天数后的日期和时间。
  • OffsetDateTime#plusHours(long hours):在当前OffsetDateTime对象的基础上加上指定的小时数。这个方法接受一个长整型参数,表示要添加的小时数。使用场景包括需要计算未来某一时间点在特定小时数后的日期和时间。
  • OffsetDateTime#plusMinutes(long minutes):在当前OffsetDateTime对象的基础上加上指定的分钟数。这个方法接受一个长整型参数,表示要添加的分钟数。使用场景包括需要计算未来某一时间点在特定分钟数后的日期和时间。
  • OffsetDateTime#plusSeconds(long seconds):在当前OffsetDateTime对象的基础上加上指定的秒数。这个方法接受一个长整型参数,表示要添加的秒数。使用场景包括需要计算未来某一时间点在特定秒数后的日期和时间。
  • OffsetDateTime#plusNanos(long nanos):在当前OffsetDateTime对象的基础上加上指定的纳秒数。这个方法接受一个长整型参数,表示要添加的纳秒数。使用场景包括需要计算未来某一时间点在特定纳秒数后的日期和时间。
@Test
public void test11() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));OffsetDateTime offsetDateTime1 = offsetDateTime.plus(1, ChronoUnit.YEARS);System.out.println(offsetDateTime1);//输出结果:2024-11-28T09:46:56+08:00OffsetDateTime offsetDateTime2 = offsetDateTime.plus(Period.ofYears(2));System.out.println(offsetDateTime2);//输出结果:2025-11-28T09:46:56+08:00OffsetDateTime offsetDateTime3 = offsetDateTime.plusYears(2);System.out.println(offsetDateTime3);//输出结果:2025-11-28T09:46:56+08:00OffsetDateTime offsetDateTime4 = offsetDateTime.plusMonths(1);System.out.println(offsetDateTime4);//输出结果:2023-12-28T09:46:56+08:00OffsetDateTime offsetDateTime5 = offsetDateTime.plusDays(3);System.out.println(offsetDateTime5);//输出结果:2023-12-01T09:46:56+08:00OffsetDateTime offsetDateTime6 = offsetDateTime.plusHours(1);System.out.println(offsetDateTime6);//输出结果:2023-11-28T10:46:56+08:00OffsetDateTime offsetDateTime7 = offsetDateTime.plusMinutes(4);System.out.println(offsetDateTime7);//输出结果:2023-11-28T09:50:56+08:00OffsetDateTime offsetDateTime9 = offsetDateTime.plusSeconds(4);System.out.println(offsetDateTime9);//输出结果:2023-11-28T09:47+08:00OffsetDateTime offsetDateTime8 = offsetDateTime.plusWeeks(1);System.out.println(offsetDateTime8);//输出结果:2023-12-05T09:46:56+08:00
}

OffsetDateTime#minus(...)、OffsetDateTime#minusYears(...)、OffsetDateTime#minusMonths(...)、OffsetDateTime#minusWeeks(...)、OffsetDateTime#minusDays(...)、OffsetDateTime#minusHours(...)、OffsetDateTime#minusMinutes(...)、OffsetDateTime#minusSeconds(...)、OffsetDateTime#minusNanos(...)

这些方法用于在日期时间对象中减去指定的时间单位。具体如下:

  • OffsetDateTime#minus():此方法用于在解析的日期和时间中减去指定的时间长度。它接受一个时间单位作为参数,可以是秒、分钟、小时、天等,并返回一个新的 OffsetDateTime 对象,该对象表示减去指定时间长度后的日期和时间。
  • OffsetDateTime#minusYears():此方法用于在解析的日期中减去指定的年份。它接受一个整数参数,表示要减去的年份数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定年数后的日期和时间。
  • OffsetDateTime#minusMonths():此方法用于在解析的日期中减去指定的月份。它接受一个整数参数,表示要减去的月份数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定月数后的日期和时间。
  • OffsetDateTime#minusWeeks():此方法用于在解析的日期中减去指定的周数。它接受一个整数参数,表示要减去的周数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定周数后的日期和时间。
  • OffsetDateTime#minusDays():此方法用于在解析的日期中减去指定的天数。它接受一个整数参数,表示要减去的天数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定天数后的日期和时间。
  • OffsetDateTime#minusHours():此方法用于在解析的时间中减去指定的小时数。它接受一个整数参数,表示要减去的小时数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定小时数后的日期和时间。
  • OffsetDateTime#minusMinutes():此方法用于在解析的时间中减去指定的分钟数。它接受一个整数参数,表示要减去的分钟数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定分钟数后的日期和时间。
  • OffsetDateTime#minusSeconds():此方法用于在解析的时间中减去指定的秒数。它接受一个整数参数,表示要减去的秒数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定秒数后的日期和时间。
  • OffsetDateTime#minusNanos():此方法用于在解析的时间中减去指定的纳秒数。它接受一个整数参数,表示要减去的纳秒数。返回一个新的 OffsetDateTime 对象,该对象表示减去指定纳秒数后的日期和时间。

这些方法都返回一个新生成的 OffsetDateTime 对象,而不是修改原始对象。使用这些方法可以进行精确的日期和时间计算,适用于各种场景,如日程安排、时间间隔计算等。需要注意的是,当减去负值时,将会增加相应的时间单位。例如,调用 minusYears(-1) 将增加一年。

@Test
public void test12() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));OffsetDateTime offsetDateTime1 = offsetDateTime.minus(1, ChronoUnit.YEARS);System.out.println(offsetDateTime1);//输出结果:2022-11-28T09:46:56+08:00OffsetDateTime offsetDateTime2 = offsetDateTime.minus(Period.ofYears(2));System.out.println(offsetDateTime2);//输出结果:2021-11-28T09:46:56+08:00OffsetDateTime offsetDateTime3 = offsetDateTime.minusYears(2);System.out.println(offsetDateTime3);//输出结果:2021-11-28T09:46:56+08:00OffsetDateTime offsetDateTime4 = offsetDateTime.minusMonths(1);System.out.println(offsetDateTime4);//输出结果:2023-10-28T09:46:56+08:00OffsetDateTime offsetDateTime5 = offsetDateTime.minusDays(3);System.out.println(offsetDateTime5);//输出结果:2023-11-25T09:46:56+08:00OffsetDateTime offsetDateTime6 = offsetDateTime.minusHours(1);System.out.println(offsetDateTime6);//输出结果:2023-11-28T08:46:56+08:00OffsetDateTime offsetDateTime7 = offsetDateTime.minusMinutes(4);System.out.println(offsetDateTime7);//输出结果:2023-11-28T09:42:56+08:00OffsetDateTime offsetDateTime9 = offsetDateTime.minusSeconds(4);System.out.println(offsetDateTime9);//输出结果:2023-11-28T09:46:52+08:00OffsetDateTime offsetDateTime8 = offsetDateTime.minusWeeks(1);System.out.println(offsetDateTime8);//输出结果:2023-11-21T09:46:56+08:00
}

OffsetDateTime#query(...)

OffsetDateTime#query() 接受一个TemporalQuery对象作为参数,并使用该查询对象对当前 OffsetDateTime 实例进行查询。TemporalQuery 是一个函数式接口,它接受一个 Temporal 对象并返回一个查询结果。你可以使用 OffsetDateTime#query() 方法进行各种自定义查询。

@Test
public void test13() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));TemporalQuery<Integer> temporalQuery = item -> item.get(ChronoField.YEAR);Integer year = offsetDateTime.query(temporalQuery);System.out.println(year);//输出结果:2023
}

OffsetDateTime#until(...)

OffsetDateTime#until()用于计算当前OffsetDateTime对象,以指定的单位到另一个日期时间为止的时间量。

@Test
public void test14() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2020, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));OffsetDateTime offsetDateTime2 = OffsetDateTime.of(2023, 12, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));long until = offsetDateTime.until(offsetDateTime2, ChronoUnit.MONTHS);System.out.println(until);//输出结果:37
}

OffsetDateTime#format(...)

OffsetDateTime#format() 用于将当前的日期时间对象格式化为指定的字符串表示形式。

@Test
public void test15() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2020, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));String format = offsetDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println(format);//输出结果:2020-11-28 09:46:56
}

OffsetDateTime#atZoneSameInstant(...)、OffsetDateTime#atZoneSimilarLocal(...)

  • OffsetDateTime#atZoneSameInstant(ZoneId zone)方法的功能作用是:将此日期时间与时区组合以创建ZonedDateTime,以保持相同的本地日期和时间。该方法接受一个ZoneId类型的参数,该参数表示要使用的时区。使用该方法可以保持相同的本地日期和时间,而不会受到时区的影响。
  • OffsetDateTime#atZoneSimilarLocal(ZoneId zone)方法的功能作用是:将此日期时间与时区组合以创建ZonedDateTime,以保持相同的本地日期和时间。该方法同样接受一个ZoneId类型的参数,表示要使用的时区。使用该方法可以保持相同的本地日期和时间,但会受到时区的影响。

这两个方法的使用场景如下:

  • 在处理涉及日期时间和时区的计算或比较时,可以使用atZoneSameInstant()方法来确保在相同的本地时间点进行操作,避免时区转换带来的问题。例如,在计算两个事件之间的时间差或者比较不同时区的本地时间点时,可以使用该方法来保证计算或比较的准确性。
  • 在需要进行时区转换或处理不同时区的日期时间需求时,可以使用atZoneSimilarLocal()方法来保持相同的本地日期和时间。例如,在将一个日期时间对象从一个时区转换为另一个时区时,可以使用该方法来保持转换前后相同的本地日期和时间。

需要注意的是,这两个方法都会创建一个新的ZonedDateTime对象,而不会修改原始的OffsetDateTime对象。因此,在使用这些方法时需要注意对新的ZonedDateTime对象的处理。

@Test
public void test16() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2020, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));ZonedDateTime zonedDateTime = offsetDateTime.atZoneSimilarLocal(ZoneOffset.ofHours(-13));System.out.println(zonedDateTime);//输出结果:2020-11-28T09:46:56-13:00ZonedDateTime zonedDateTime1 = offsetDateTime.atZoneSameInstant(ZoneOffset.ofHours(-13));System.out.println(zonedDateTime1);//输出结果:2020-11-27T12:46:56-13:00
}

OffsetDateTime#toOffsetTime(...)、OffsetDateTime#toZonedDateTime(...)、OffsetDateTime#toInstant(...)、OffsetDateTime#toEpochSecond(...)

  • OffsetDateTime#toOffsetTime()的功能作用是将给定的日期时间转换为一个OffsetTime对象,这个转换将保留原始日期时间中的本地时间和偏移量。使用场景:当你需要将一个OffsetDateTime对象转换为一个OffsetTime对象,以便进行更细粒度的时间操作时,可以使用该方法。例如,如果你需要在一个应用程序中处理具体到小时的时间,但你的数据源提供的是OffsetDateTime对象,那么你可以使用toOffsetTime()方法来获取对应的OffsetTime对象。
  • OffsetDateTime#toZonedDateTime()的功能作用是将给定的OffsetDateTime对象转换为一个ZonedDateTime对象,这个转换将保留原始OffsetDateTime对象中的日期时间信息和时区信息。使用场景:当你需要将一个OffsetDateTime对象转换为一个ZonedDateTime对象,以便进行更复杂的时间和时区相关的操作时,可以使用该方法。例如,如果你需要在一个应用程序中处理涉及时区的日期时间操作,但你的数据源提供的是OffsetDateTime对象,那么你可以使用toZonedDateTime()方法来获取对应的ZonedDateTime对象。
  • OffsetDateTime#toInstant()的功能作用是将给定的OffsetDateTime对象转换为一个Instant对象,这个转换将保留原始OffsetDateTime对象中的日期时间信息和偏移量信息。使用场景:当你需要将一个OffsetDateTime对象转换为一个Instant对象,以便进行更复杂的日期时间操作,特别是涉及到跨时区的操作时,可以使用该方法。例如,如果你需要在一个应用程序中处理全球范围内的日期时间操作,但你的数据源提供的是OffsetDateTime对象,那么你可以使用toInstant()方法来获取对应的Instant对象。
  • OffsetDateTime#toEpochSecond()的功能作用是将给定的OffsetDateTime对象转换为一个long类型的Epoch秒数,这个转换将保留原始OffsetDateTime对象中的日期时间信息和偏移量信息。使用场景:当你需要将一个OffsetDateTime对象转换为一个Epoch秒数,以便进行更简单的日期时间比较或排序等操作时,可以使用该方法。例如,如果你需要在一个应用程序中对一组日期时间进行排序,但你的数据源提供的是OffsetDateTime对象,那么你可以使用toEpochSecond()方法来获取对应的Epoch秒数,并使用这些秒数进行排序。
@Test
public void test17() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2020, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));OffsetTime offsetTime = offsetDateTime.toOffsetTime();System.out.println(offsetTime);//输出结果:09:46:56+08:00ZonedDateTime zonedDateTime = offsetDateTime.toZonedDateTime();System.out.println(zonedDateTime);//输出结果:2020-11-28T09:46:56+08:00Instant instant = offsetDateTime.toInstant();System.out.println(instant);//输出结果:2020-11-28T01:46:56Zlong epochSecond = offsetDateTime.toEpochSecond();System.out.println(epochSecond);//输出结果:1606528016
}

OffsetDateTime#compareTo(...)、OffsetDateTime#isAfter(...)、OffsetDateTime#isBefore(...)、OffsetDateTime#isEqual(...)

  • OffsetDateTime#compareTo()的功能作用是比较两个OffsetDateTime对象的大小。该方法将返回一个int类型的值,其中-1表示第一个对象小于第二个对象,0表示两个对象相等,1表示第一个对象大于第二个对象。使用场景:当你需要比较两个日期时间对象的大小,以便进行排序或比较等操作时,可以使用该方法。例如,如果你有一个包含OffsetDateTime对象的列表,你需要按照日期时间顺序对列表进行排序,那么你可以使用compareTo()方法来比较每个对象的大小。
  • OffsetDateTime#isAfter()的功能作用是检查一个OffsetDateTime对象是否在另一个指定日期时间之后。如果是,则返回true;否则返回false。使用场景:当你需要确定一个日期时间是否在另一个日期时间之后时,可以使用该方法。例如,如果你有一个当前日期时间和一个结束日期时间,你需要检查当前日期时间是否晚于结束日期时间,那么你可以使用isAfter()方法进行检查。
  • OffsetDateTime#isBefore()的功能作用是检查一个OffsetDateTime对象是否在另一个指定日期时间之前。如果是,则返回true;否则返回false。使用场景:当你需要确定一个日期时间是否在另一个日期时间之前时,可以使用该方法。例如,如果你有一个开始日期时间和一个当前日期时间,你需要检查当前日期时间是否早于开始日期时间,那么你可以使用isBefore()方法进行检查。
  • OffsetDateTime#isEqual()的功能作用是检查两个OffsetDateTime对象是否相等。如果是,则返回true;否则返回false。使用场景:当你需要比较两个日期时间对象是否相等时,可以使用该方法。例如,如果你有两个日期时间对象需要比较是否相同,那么你可以使用isEqual()方法进行检查。
@Test
public void test18() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2020, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(8));OffsetDateTime offsetDateTime2 = OffsetDateTime.of(2020, 11, 28, 9, 46, 56, 0, ZoneOffset.ofHours(-5));int compareTo = offsetDateTime.compareTo(offsetDateTime2);System.out.println(compareTo);//输出结果:-1boolean before = offsetDateTime.isBefore(offsetDateTime2);System.out.println(before);//输出结果:trueboolean after = offsetDateTime.isAfter(offsetDateTime2);System.out.println(after);//输出结果:falseboolean equal = offsetDateTime.isEqual(offsetDateTime2);System.out.println(equal);//输出结果:false
}

OffsetDateTime的使用场景

OffsetDateTime的使用场景非常广泛,主要包括以下几个方面:

  • 日期时间操作:OffsetDateTime可以用于表示和操作具体的日期和时间,包括年、月、日、小时、分钟、秒等。可以用于计算时间差、比较日期时间的大小、进行日期时间的格式化等。
  • 时区处理:在处理全球化的日期时间时,OffsetDateTime可以表示不同的时区。通过存储偏移量信息,可以方便地在不同时区之间转换日期时间。
  • 日历和日程安排:OffsetDateTime可以用于日历系统的开发,例如制作日程表、安排会议等。可以方便地获取某个特定日期或时间的信息,以及进行日期的计算和时间间隔的测量。
  • 金融和商务应用:在金融和商务领域,OffsetDateTime可以用于处理交易时间、计算利息、处理时间差异等问题。可以确保交易的准确性和一致性,避免因时区差异带来的问题。
  • 系统管理和监控:在系统管理和监控方面,OffsetDateTime可以用于记录系统事件、生成日志、跟踪任务执行时间等。可以方便地获取事件发生的具体时间和日期,以及进行相关的时间计算和分析。
  • 时间和日期的展示:在需要展示日期时间和时区的应用场景下,例如网站或应用程序的用户界面,OffsetDateTime可以用于获取当前日期时间和时区信息,以及进行日期时间的格式化展示。

总之,OffsetDateTime在各种应用场景下都可以发挥重要作用,特别是在需要处理全球化日期时间、时区转换、精确时间戳等需求的场景下。

相关文章:

深入了解Java8新特性-日期时间API:OffsetDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概24000多字&#xff0c;预计阅读时间长需要20分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…...

企业微信http协议接口开发,发送位置消息

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…...

CSS——基础选择器、文字控制属性

1、CSS定义 层叠样式表&#xff08;Cascading Style Sheets&#xff0c;缩写为CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加style双标签&#xff0c;styl…...

08-中介者模式-C语言实现

中介者模式&#xff1a; Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.&#xff08;用一个中介对…...

【开源】基于JAVA的医院门诊预约挂号系统

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…...

NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

目录 (一)Nodejs简介 1.nodejs是什么 2.nodejs架构 3.nodejs的应用场景 (二)准备工作 1.安装nodejs 2.nodejs版本管理工具 (三)nodejs的使用 1.node的输入 2.node的输出 3.其他的console方法 (四)全局对象 1.常见的全局对象 2.特殊的全局对象 3.global和window的…...

hive 命令记录(随时更新)

1.进入 hive 数据库&#xff1a; hive 2.查看hive中的所有数据库&#xff1a; show databases; 3.用 default 数据库 use default; 4.查看所有的表 show tables; 5.查询 book 表结构&#xff1a; desc book ; 6.查询 book 表数据 select * from book; 7.创建 shop 数据库 creat…...

java实战(五):理解多线程与多线程实现冒泡排序及可视化

多线程 1.多线程理解1.1线程概念1.2线程的创建和启动1.3线程的同步与互斥1.4线程的状态和生命周期1.5线程间的通信1.6处理线程的异常和错误1.7实践 2.效果3.代码 1.多线程理解 1.1线程概念 线程&#xff1a;计算机中能够执行独立任务的最小单位。在操作系统中&#xff0c;每个…...

mysql-binlog,redolog 和 undolog区别

binlog MySQL的binlog&#xff08;二进制日志 或 归档日志&#xff09;是一种记录数据库的更改操作的日志。它包含了对数据库进行的插入、更新和删除操作的详细信息。binlog是以二进制格式存储&#xff0c;可以用于恢复数据库、数据复制和数据同步等操作。具体来说&#xff0c…...

Redis SDS 源码

struct sdshdr {int len;int free;char buf[]; }; 底层数据结构的好处&#xff1a; 杜绝缓冲区溢出。减少修改字符串长度时所需的内存重分配次数。二进制安全。兼容部分C字符串函数。 常用命令&#xff1a; set key value、get key 等 应用场景&#xff1a;共享 session、分…...

肖sir__mysql之单表练习题2__(2)

mysql之单表练习题 一.建表语句 create table grade(class int(4),chinese int(8),english int(4),math int(8),name varchar(20),age int(8),sid int(4)primary key auto_increment) DEFAULT charsetutf8; insert into grade(class,chinese,english,math,name,age)values(1833…...

nuxt、vue实现PDF和视频文件的上传、下载、预览

上传 上传页面 <el-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6"><PdfUpload v-model"form.ququ6" :fileType"[pdf, mp4, avi, ts]"></PdfUpload> </el-form-i…...

c++ 写成.h .cpp main.cpp 多文件形式

1 .h 声明方法/函数 用于连接定义和实例使用 // max.h #ifndef MAX_H #define MAX_Hint max(int a, int b);#endif /* 在#ifndef和#define中使用的MAX_H就是指的max.h这个头文件的名字。具体来说,#ifndef MAX_H中MAX_H代表了max.h这个头文件的一个唯一的标识符。#define MAX_H…...

组合总和(回溯)

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 样例输入 示例 1: 输入: k 3, n 7 …...

【代码】微电网两阶段鲁棒优化经济调度方法(完美复现)matlab-yalmip-cplex/gurobi

程序名称&#xff1a;两阶段鲁棒优化—微电网两阶段鲁棒优化经济调度方法_刘一欣 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 简介&#xff1a;针对微电网内可再生能源和负荷的不确定性&#xff0c;建立了 min-max-min 结构的两阶段鲁棒优化模型&#xff0c;可得到最恶…...

关于无线测温系统在海上石油平台的应用探讨-安科瑞 蒋静

摘要&#xff1a;海上石油平台的封闭式中高压配电盘在平台电力系统起着十分重要的作用&#xff0c;通过统计其配电盘的 大部分故障为前期的热效应引起&#xff0c;由于配电盘内部空间封闭狭小&#xff0c;所以无法进行人工巡查测温&#xff0c;这给油田的供电系统埋下了一定的潜…...

CSS 滚动捕获 scroll-padding

scroll-padding 非滚动捕获容器滚动捕获容器语法兼容性 CSS 滚动捕获 scroll-padding 设置元素的滚动内边距, 就像 padding 所做的那样. 但并不影响布局. 非滚动捕获容器 我们先来看看不影响布局到底是什么意思. 我们平时会见到左侧是内容, 右侧是内容导航的页面, 比如下图 这…...

asp.net core webpi 结合jwt实现登录鉴权

1.安装jwt nuget包 <PackageReference Include"Microsoft.AspNetCore.Authentication.JwtBearer" Version"6.0.25" /><PackageReference Include"System.IdentityModel.Tokens.Jwt" Version"7.0.3" />1.1创建jwt配置类 n…...

【香橙派】实战记录2——烧录安卓镜像及基本功能

文章目录 一、安卓烧录二、安卓基本功能1、蓝牙2、相机功能3、投屏 一、安卓烧录 检查环境&#xff1a;检查PC系统&#xff0c;确保有Microsoft Visual C 2008 Redistrbutable - x86&#xff0c;否则在官网下载的官方工具 - 安卓镜像烧录工具里运行vcredist_x86.exe。 插入存储…...

【spring(六)】WebSocket网络传输协议

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 核心概要&#xff1a; 概念介绍&#xff1a; 对比HTTP协议&#xff1a;⭐ WebSocket入门案例&#xff1a;⭐ 核心概要&#xff1a; websocket对比http 概念介绍&#xff1a; WebSocket是Web服务器的一个组件…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...