已知某年和某月,获得该月的周数及每周的始末时间

最近阿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-01 00:00:00结束时间2019-03-03 23:59:592周开始时间2019-03-03 00:00:00结束时间2019-03-10 23:59:593周开始时间2019-03-10 00:00:00结束时间2019-03-17 23:59:594周开始时间2019-03-17 00:00:00结束时间2019-03-24 23:59:595周开始时间2019-03-24 00:00:00结束时间2019-03-31 23:59:59

可能阿Q写的比较复杂,大家如果有简单的实现方法可以告诉阿Q,大家共用进步。想了解更多学习知识,请关注微信公众号“阿Q说”,获取更多学习资料吧!你也可以后台留言说出你的疑惑,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿Q说代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值