你真的知道一个月有几周吗?

简介: 你真的知道一个月有几周吗?

最近阿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,大家共用进步。

相关文章
|
1月前
|
C#
C# 技巧:如何确定日期时间范围的日周月季度半年
C# 技巧:如何确定日期时间范围的日周月季度半年
31 1
|
机器学习/深度学习 uml
从不认识到熟识,大概只需要一周时间
从不认识到熟识,第一次在云栖社区发文,不多说,先熟识一下 现在时间不早了,以后会多发文的
一周总结-技术(2018-03-26)
一周的时间觉得很快,翻看自己的记录,这周又学了什么,有什么收获? 上半周主要在学习数据结构相关的知识,缺乏一些练习,理论学的较多,需要找时间实践一下 花了快几天的时间给电脑装各种软件,现在再看有用到的还剩下Zoomy,CmdTap,GridSTURA,PDFGuru,lyn等,有些软件用起来不错,能提升效率。
|
新零售 算法 Java
一周总结(2018-03-19)
忙着学习之前先停下来思考上周做了那些,有很多值得回忆与记录的地方,相比之前,一些变化。 上周 学习了《从0到1,设计电商平台-服务端》,《秒杀系统设计》,这两个是付费课程,不过总体来说都有收获。