获取给定年月,当月有几周,每周开始结束日期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | package date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 获取给定年月计算当月有几周,每周的开始和结束日期 * @author pei * */ public class TestLocal { static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); public static void main(String[] args) { List<Map> list = getScope(); System.out.println( "list=====" +list); } public static List<Map> getScope() { String date = "2023-01-01" ; String timeStrs[] = date.split( "-" ); Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, Integer.parseInt(timeStrs[ 0 ])); c.set(Calendar.MONTH, Integer.parseInt(timeStrs[ 1 ]) - 1 ); c.setFirstDayOfWeek(Calendar.MONDAY); int weeks = c.getActualMaximum(Calendar.WEEK_OF_MONTH); LocalDate localDateate = LocalDate.parse(date, dateTimeFormatter); //月份第一周的起始时间和结束时间 LocalDate firstDay = localDateate.with(TemporalAdjusters.firstDayOfMonth()); String firstDayStr = firstDay.format(dateTimeFormatter); String sunStr = getSunOfWeek(firstDayStr); List<Map> weekInfos = new ArrayList<>(); for ( int i = 1 ; i <= weeks; i++) { Map weekInfo = new HashMap(); //第一周的起始时间就是当月的1号,结束时间就是周日 if (i == 1 ) { weekInfo.put( "start" ,firstDayStr); weekInfo.put( "end" ,sunStr); weekInfo.put( "order" ,i); //计算接下来每周的周一和周日 } else if (i < weeks) { //由于sunStr是上一周的周日,所以取周一要取sunStr的下一周的周一 String monDay = getLastMonOfWeek(sunStr); sunStr = getSunOfWeek(monDay); weekInfo.put( "start" ,monDay); weekInfo.put( "end" ,sunStr); weekInfo.put( "order" ,i); //由于最后一周可能结束时间不是周日,所以要单独处理 } else { String monDay = getLastMonOfWeek(sunStr); //结束时间肯定就是当前月的最后一天 LocalDate lastDay = localDateate.with(TemporalAdjusters.lastDayOfMonth()); String endDay = lastDay.format(dateTimeFormatter); weekInfo.put( "start" ,monDay); weekInfo.put( "end" ,endDay); weekInfo.put( "order" ,i); } weekInfos.add(weekInfo); } return weekInfos; } //算出所在周的周日 public static String getSunOfWeek(String time) { LocalDate localDateate = LocalDate.parse(time, dateTimeFormatter); LocalDate endday = localDateate.with(TemporalAdjusters.next(java.time.DayOfWeek.MONDAY)).minusDays( 1 ); String endDayStr = endday.format(dateTimeFormatter); return endDayStr; } //下一周的周一 public static String getLastMonOfWeek(String time) { LocalDate localDateate = LocalDate.parse(time, dateTimeFormatter); LocalDate endday = localDateate.with(TemporalAdjusters.next(java.time.DayOfWeek.MONDAY)); String endDayStr = endday.format(dateTimeFormatter); return endDayStr; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)