一、一周开始时间
public static LocalDateTime getBeginTime(LocalDate now) {
return now.minusDays(now.getDayOfWeek().getValue() - 1).atStartOfDay();
}
解释说明:
- now.getDayOfWeek().getValue():获取当前日期 now 是一周中的第几天,返回的是一个整数,1 表示星期一,2 表示星期二,以此类推,7 表示星期日。
- minusDays 是 Java 8 中 LocalDate 类的方法之一,用于对日期进行减法操作。具体而言,minusDays 方法接受一个表示天数的参数,并返回一个新的 LocalDate 对象,该对象表示在原日期的基础上减去指定的天数后的日期。
- now.minusDays(now.getDayOfWeek().getValue() - 1):将当前日期减去当前是一周中的第几天再减去 1天,这样就得到了当前周的第一天的日期。例如,如果今天是星期三(3),那么这个操作会将日期减去 2 天,使得当前日期变为当前周的第一天,也就是星期一。
- 代码中的.atStartOfDay():将得到的日期转换为当天的开始时间,即将时、分、秒和纳秒等时间部分设置为零。
二、一周的结束时间
public static LocalDateTime getEndTime(LocalDate now) {
return LocalDateTime.of(now.plusDays(8 - now.getDayOfWeek().getValue()), LocalTime.MAX);
}
解释说明
- now.getDayOfWeek().getValue():获取当前日期 now 是一周中的第几天,返回的是一个整数,1 表示星期一,2 表示星期二,以此类推,7 表示星期日。
- now.plusDays(8 - now.getDayOfWeek().getValue()):将当前日期加上一个值,使其变为当前周的最后一天。8 - now.getDayOfWeek().getValue() 的结果表示距离当前日期最近的星期日的天数。例如,如果今天是星期三(3),那么 8 - 3 等于 5,就是说需要再加 5 天,才能到达本周的最后一天,即星期日。
- LocalDateTime.of(…, LocalTime.MAX):使用 LocalDateTime.of 方法将日期和时间组合,构建一个新的 LocalDateTime 对象。在这里,我们将日期设为计算得到的当前周的最后一天,而将时间设为当天的最后一刻,即 LocalTime.MAX,表示23:59:59.999999999。
- 注: LocalDateTime.of 是 java.time.LocalDateTime 类的一个静态工厂方法,用于创建一个 LocalDateTime 对象。这个方法的目的是将年、月、日、时、分等时间单位组合成一个完整的日期时间对象。
源码如下:
/* Obtains an instance of LocalDateTime from a date and time.
Params:
date – the local date, not null time – the local time, not null
Returns:
the local date-time, not null*/
public static LocalDateTime of(LocalDate date, LocalTime time) {
Objects.requireNonNull(date, "date");
Objects.requireNonNull(time, "time");
return new LocalDateTime(date, time);
}
LocalTime.MAX在源码中的值:
public static final LocalTime MAX;
static {
for (int i = 0; i < HOURS.length; i++) {
HOURS[i] = new LocalTime(i, 0, 0, 0);
}
MIDNIGHT = HOURS[0];
NOON = HOURS[12];
MIN = HOURS[0];
MAX = new LocalTime(23, 59, 59, 999_999_999);
}
三、饭后补给
- LocalTime: 是 Java 8 中 java.time 包中的一个类(下边的两个也是)。用于表示时间,但不包括日期。它表示一天中的一个时刻,包含时、分、秒和纳秒等信息,但不包含日期信息
- LocalDate: 表示日期,但没有时间部分。它包含年、月、日信息,但没有时、分、秒和纳秒等时间信息。LocalDate 可以用于表示像生日、事件日期等只关注日期而不关注具体时间的情境。
- LocalDateTime: 表示日期和时间,包含年、月、日、时、分、秒和纳秒等信息。LocalDateTime 适用于需要同时处理日期和时间的场景,比如记录事件的发生时间。