TemporalAdjusters.firstDayOfMonth

本文介绍了一个简单的方法来获取指定日期所在月份的第一天。通过使用 Java 的 TemporalAdjusters.firstDayOfMonth 方法,可以轻松实现这一功能。

TemporalAdjusters.firstDayOfMonth

	/**
	 * 获取一个新的日期,它的值为指定日期当月的第一天
	 * @param date 指定日期
	 * @return YYYY-MM-DD
	 */
	public String getFirstDayOfMonth(LocalDate date) {
		return date.with(TemporalAdjusters.firstDayOfMonth()).toString();
	}

import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; public class WeekSummaryUtils { // 主方法:根据当前日期判断是否跨月,返回对应的 week_id 列表 public static String getValidWeekIDs(LocalDate currentDate) { // 当前周的起始(周一)和结束(周日) LocalDate startOfWeek = currentDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); LocalDate endOfWeek = startOfWeek.plusDays(6); // 判断该周是否属于当前月 boolean isWeekInCurrentMonth = startOfWeek.getMonth() == currentDate.getMonth() && startOfWeek.getYear() == currentDate.getYear(); List<String> validWeekIDs = new ArrayList<>(); if (!isWeekInCurrentMonth) { // 周起始不在当前月:获取上个月所有完整周 validWeekIDs.addAll(getLastMonthFullWeeks(currentDate)); } else { // 周起始在当前月:添加当前周(不管是否完整) + 所有完整前周 validWeekIDs.add(generateWeekID(startOfWeek)); validWeekIDs.addAll(getPreviousFullWeeks(currentDate)); } return String.join(",", validWeekIDs); } // 根据起始日期生成 week_id(正确逻辑) private static String generateWeekID(LocalDate startOfWeek) { int year = startOfWeek.getYear(); Month month = startOfWeek.getMonth(); int weekNumber = (startOfWeek.getDayOfMonth() - 1) / 7 + 1; return String.format("%d%02d_%d", year, month.getValue(), weekNumber); } // 获取当前月中当前周之前的完整周 private static List<String> getPreviousFullWeeks(LocalDate currentDate) { List<String> weeks = new ArrayList<>(); LocalDate current = currentDate.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).minusWeeks(1); LocalDate firstDayOfMonth = currentDate.with(TemporalAdjusters.firstDayOfMonth()); while (!current.isBefore(firstDayOfMonth)) { LocalDate startOfWeek = current.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); if (startOfWeek.getMonth() == currentDate.getMonth() && startOfWeek.getYear() == currentDate.getYear()) { weeks.add(0, generateWeekID(startOfWeek)); } current = current.minusWeeks(1); } return weeks; } private static List<String> getLastMonthFullWeeks(LocalDate currentDate) { LocalDate lastMonth = currentDate.minusMonths(1); // 比如 2025-07 -> 2025-06 LocalDate firstDayOfLastMonth = lastMonth.with(TemporalAdjusters.firstDayOfMonth()); LocalDate lastDayOfLastMonth = lastMonth.with(TemporalAdjusters.lastDayOfMonth()); List<String> weeks = new ArrayList<>(); LocalDate current = lastDayOfLastMonth; while (!current.isBefore(firstDayOfLastMonth)) { LocalDate sunday = current.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); LocalDate monday = sunday.minusDays(6); if (monday.getMonth() == lastMonth.getMonth() && monday.getYear() == lastMonth.getYear()) { weeks.add(0, generateWeekID(monday)); } current = current.minusWeeks(1); } return weeks; } // 测试主方法 public static void main(String[] args) { LocalDate date1 = LocalDate.of(2025, 8, 1); System.out.println("date1 对应的 week_id:" + getValidWeekIDs(date1)); LocalDate date2 = LocalDate.of(2025, 8, 7); System.out.println("date2 对应的 week_id:" + getValidWeekIDs(date2)); } } 还是只返回了202508_1,怎么没有202508_2
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值