最近阿Q在项目开发中遇到一个小问题:
后台统计:已知某年和某月,计算该月每周的销量。
这就要求我们要获取特定年月的周数以及每周的始末时间来对数据库数据进行筛选。大家一看到这个问题是不是都会想起java的日期类Calendar,然后会调用getActualMaximum(Calendar.WEEK_OF_MONTH)来查询该月有多少个周啊?接下来,阿Q就给大家说一下该方法存在的问题以及解决方法。
众所周知,国外的每周都是从周日开始周六结束,而我们却是以周一开始,周日结束,因此我们在获得某月的周数时便会存在误差,下边就用程序进行讲解。
public class HelloWorld { public static void main(String[] args) { Calendar c= Calendar.getInstance(); c.set(Calendar.YEAR,2019); //因为月份是从下标0开始的,所以这里的“2”是三月份 c.set(Calendar.MONTH,2); System.out.println("周数:"+c.getActualMaximum(Calendar.WEEK_OF_MONTH)); } }
输出结果为周数:6,而实际为5周。阿Q为解决该问题就自己写了一段代码来实现此功能。
public static void main(String[] args) throws Exception { //随意定义 String saeTime = "2019-03"; //转换为时间类型 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM"); Date dt = dateFormat.parse(saeTime); Calendar calendar = new GregorianCalendar(); calendar.setTime(dt); //获取本月的天数 int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //记录本月的周数 int count = 0; //记录第一周的开始日期、最后一周的结束日期以及每周周日的日期 List<Date> list = new ArrayList<Date>(); for (int i = 1; i <= days; i++) { DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = dFormat.parse(saeTime + "-" + i); //清空calendar重新赋值 calendar.clear(); calendar.setTime(date); //获取该日期是一周中的第几天 int k = new Integer(calendar.get(Calendar.DAY_OF_WEEK)); //第一天且不是周天要记录一周的开始日期 if(i==1 && k!=1){ list.add(date); } if (k == 1) { //只要是周日,count就加1 count++; //记录一周结束日期 list.add(date); } if (k != 1 && i == days) {//若是本月最后一天,且不是周日也算一周也要加1 count++; //记录最后一天日期 list.add(date); } } System.out.println("该月有"+count+"周"); for(int i=0;i<count;i++){ Date firstDate = list.get(i); //开始时间为0时0分0秒 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00"); String firstTime = sdf.format(firstDate); Date secondDate = list.get(i+1); //结束时间为23时59分59秒 SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd 23:59:59"); String secondTime = sDateFormat.format(secondDate); System.out.println("第"+(i+1)+"周开始时间"+firstTime+"结束时间"+secondTime); } }
打印结果:
该月有5周
第1周开始时间2019-03-0100:00:00结束时间2019-03-0323:59:59
第2周开始时间2019-03-0300:00:00结束时间2019-03-1023:59:59
第3周开始时间2019-03-1000:00:00结束时间2019-03-1723:59:59
第4周开始时间2019-03-1700:00:00结束时间2019-03-2423:59:59
第5周开始时间2019-03-2400:00:00结束时间2019-03-3123:59:59
可能阿Q写的比较复杂,大家如果有简单的实现方法可以告诉阿Q,大家共用进步。