获取月份最后日期

Get the month last date

我有一个 LocalDateTime 对象,我想获取该月的最后一个日期。因此,如果 localDateTime 指向今天的 10 月 29 日。我想将其转换为 10 月 31 日
有没有简单易行的方法?
我的想法:
一种方法是获取月份,然后进行 switch 语句。但那将是漫长而乏味的方法。不确定是否有内置方法
可以执行相同的操作

使用YearMonth.atEndOfMonth

LocalDate date = LocalDate.now();
YearMonth month = YearMonth.from(date);
LocalDate end = month.atEndOfMonth();
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String args[]) {
      LocalDateTime a = LocalDateTime.of(2021, 10, 29, 0, 0);
      LocalDateTime b = a.with(TemporalAdjusters.lastDayOfMonth());
      
      System.out.println(a);
      System.out.println(b);
    }
}

你问过:

How do I add the endTime of day to the localDateTime. I see an option called LocalTime.MAX but it adds trailing .99999

如果您正在跟踪时间轴上的时刻、特定点,请不要使用 LocalDateTime。 class 缺少时区上下文或与 UTC 的偏移量。暂时使用 InstantOffsetDateTimeZonedDateTime.

YearMonth 表示整个月。

你不应该试图确定这个月的最后一刻。最后一刻是无限可分的。通常,定义时间跨度的最佳方法是半开放法而不是全封闭法。在 Half-Open 中,开始是 inclusive 而结束是 exclusive.

所以一天从一天的第一刻开始,一直到但不包括 下一个 天的第一刻。一个月从该月第一天的第一刻开始,一直到但不包括 下一个 月的第一刻。

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;

YearMonth currentMonth = YearMonth.now( z ) ;
YearMonth followingMonth = currentMonth.plusMonths( 1 ) ;

ZonedDateTime start = currentMonth.atDay( 1 ).atStartOfDay( z ) ;
ZonedDateTime end = followingMonth.atDay( 1 ).atStartOfDay( z ) ;

为了表示那个时间跨度,添加 ThreeTen-Extra library to your project. Use the Interval class 及其方便的比较方法,例如 abutsoverlapscontains

org.threeten.extra.Interval interval = Interval.of( start.toInstant() , end.toInstant() ) ;