计算日期在当月是第几周-【自然周(每月第一个周一为该月第一周)做法以及1号为第一周做法】

本文介绍如何使用Java LocalDate API处理公司项目中统计周报的需求。首先,按照每月第一个周一为该月第一周的方法,通过获取日期所在周的周一及该月第一个周一,判断周数。接着,讨论了以1号为每月第一周的计算方式。文章还提及了特殊情况的处理,如日期为周一或上一周最后一周的情况,并建议对计算结果进行缓存优化。
摘要由CSDN通过智能技术生成

背景

公司项目需求是统计周报,一开始我的做法是按每月1号开始为第一周统计周报,比如2020-05-01到2020-05-03属于5月第一周,2020-05-04到2020-05-10为5月第二周。

2020年5月日历
产品小姐姐看了觉得不对,账单周报统计,是以一周7天为维度,如果按照上面的做法,统计出来5月第一周的周报只有3天,4月最后一周只有4天,这种不符合账单统计型产品的需求。
后面又拿出支付宝的周报账单给我看

图片名称 看了看支付宝的做法,发现这是以每月第一个星期一作为这个月一周的开始。(好吧,原来这就是所谓的自然周,又得重写打标了)

第一步当然先去Google百度,但是找了一段时间都没有想要的,不是这个抄那个,就是太杂太乱。总之最后决定还是自己写这个逻辑了。

Java LocalDate API

每月第1个周一为该月第一周的做法

其实知道了规则之后,做法和思路很简单。

  • 获得日期的所在周的周一
  • 获得日期这个月的第一个周一
  • 根据两个周一判断是这个月的第几周
/**
     * 传入日期判断属于哪一年哪一月第几周
     *
     * @apiNote 以每月的第一个周一所在的周作为每月第一周
     * @param date	时间格式(yyyyMMdd) 20200701
     * @return java.lang.String 返回字符串(2020-06-W5) 2020年6月第5周
     * @author kiring
     */
    public String getWeekOfMonthByDay(int date){
   
        DateTimeFormatter dfDay = DateTimeFormatter.ofPattern("yyyyMMdd");
        LocalDate localDate = LocalDate.of(date / 10000, (date / 100) % 100, date % 100);
        // 获得当前日期的所在周的周一(previousOrSame:如果当前日期是周一,就返回当前日期)
        LocalDate localDateMondy = LocalDate.of(date / 10000, (date / 100) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值