Java 根据字符串格式日期 转化出当前属于哪一年的第几周

该文章介绍了一个Java函数,用于将指定日期转换为当年的第几周。函数使用Calendar类,考虑了周的起始日为周一以及最小一周包含4天的情况,以与MySQL的WEEKOFYEAR函数保持一致。文中还提供了测试用例,展示了如何处理跨年周数的情况。
摘要由CSDN通过智能技术生成

函数:
 

    /**
     * 转化指定日期,哪一年第几周
     * @param dateStr
     * @return
     */
    public static String getWeeksInMonthOfDate(String dateStr) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.setMinimalDaysInFirstWeek(4);
        calendar.setTime(dateFormat.parse(dateStr));
        int weekOfYear = calendar.get(Calendar.YEAR);
        int weekNo = calendar.get(Calendar.WEEK_OF_YEAR);
        //Calendar获取月份需要+1
        int nowMonth = calendar.get(Calendar.MONTH) +1;
        //正常12月份肯定都是大月份的周数如53 52 51 50 49 如果周数是1而月份是12,则表示日期被计算在了下一年 年份需要 +1
        if(weekNo==1 && nowMonth==12){
            weekOfYear = weekOfYear + 1;
        }
        //1月份肯定都是小周数如1,2,3,4,5 如果周数是52 或者53 而月份是1 则表示日期被计算在了上一年,年份需要-1
        if((weekNo==53 || weekNo==52)  && nowMonth==1){
            weekOfYear = weekOfYear - 1;
        }
     return  weekOfYear+"年"+"第"+weekNo+"周";
    }

ps:

calendar.setMinimalDaysInFirstWeek(4);

为什么设置4 ,至少4天, 因为跟sql很多函数保持一致。

MySQL WEEKOFYEAR() 函数返回给定日期位于当年的第几周,取值范围为 1 到 53

该函数的前提是“一周的第一天是星期一,并且一年中的第一周有 3 天以上”,它相当于 WEEK(date,3)

测试效果:
 

    public static void main(String[] args) throws ParseException {
        String dayStr="2023-04-06";
        String result = getWeeksInMonthOfDate(dayStr);
        System.out.println(result);
    }

输出:

2023年第14周


注意点, 比如2022-01-02 ,看起来是22年的日期,其实是属于在2021年的 52周里面。

测试效果:

    public static void main(String[] args) throws ParseException {
        String dayStr="2022-01-02";
        String result = getWeeksInMonthOfDate(dayStr);
        System.out.println(result);

    }

输出:

2021年第52周

相当于mysql的  WEEKOFYEAR 函数  :


 

 好了,该篇就到这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小目标青年

对你有帮助的话,谢谢你的打赏。

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

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

打赏作者

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

抵扣说明:

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

余额充值