java计算指定日期为本年第几周的实例

 更新时间:2025年11月05日 10:07:04   作者:品种  
本文介绍了在编程中按周统计数据时遇到的问题,由于mysql中按所在月的周数周统计比较麻烦,采用所在年的周数作为分组条件,并通过java计算日期属于年的第一周来进行二次计算,提高性能,同时,作者也分享了计算指定日期为本年第几周的方法,并指出了一些常见方法的缺陷

编程中经常遇到日期计算,由于项目中使用到按周统计数据,但是mysql中按所在月的周数周统计比较麻烦,于是采用所在年的周数作为分组条件,再通过java计算日期属于年的第一周来进行二次计算,提高性能。

找了下计算指定日期为本年第几周的方法,发现没有现成的API,但网上给出的方法大部分都有个缺陷:

若12月31日是 周最后一天有的以周一为每周的第一天,有的以周日为周的第一天),则计算正常,否则所在周会被计算为下一年的第一周,于是做此记录。

java8及以上版本可以采用LocalDate/LocalDateTime

/** 获取当年的第几周,返回值范围为1-53 */
public static int getWeekOfYear(LocalDate date) {
    TemporalField field = WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear();
    int week = date.get(field);
    // 12-31会被计算为下一年的第1周,所以需要特殊处理
    if (week == 1 && getLocalDate().getMonth() == Month.DECEMBER) {
        return LocalDate.of(date.getYear(), 12,31)// 直接使用指定日期的12月31日作为锚点
        .addDays(-7)// 往上推一周,一定是本年倒数第二周
        .getLocalDate().get(field) + 1;
    }
    return week;
}

java8以下版本使用Calendar

public static int getWeekOfYear(Date date) {
    Calendar calendar = Calendar.getInstance(Locale.getDefault());
    calendar.setTime(date);
    calendar.setFirstDayOfWeek(Calendar.SUNDAY); // 设置每周的第一天为星期日
    int week = calendar.get(Calendar.WEEK_OF_YEAR);
    if (week == 1 && calendar.get(Calendar.MONTH) == Calendar.DECEMBER) {
        calendar.add(Calendar.DAY_OF_MONTH, -7);
        return calendar.get(Calendar.WEEK_OF_YEAR) + 1;
    }
    return week;
}

以周日为每周第一天为例,运行结果如下

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Idea中Jdk和Language level的指定方式

    Idea中Jdk和Language level的指定方式

    这篇文章主要介绍了Idea中Jdk和Language level的指定方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java面试题冲刺第十五天--设计模式

    Java面试题冲刺第十五天--设计模式

    这篇文章主要为大家分享了最有价值的三道关于设计模式的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 实例讲解Java并发编程之ThreadLocal类

    实例讲解Java并发编程之ThreadLocal类

    这篇文章主要介绍了实例讲解Java并发编程之ThreadLocal类,本文给出了模拟ThreadLocal、实用ThreadLocal等代码实例,需要的朋友可以参考下
    2015-04-04
  • Springboot文件上传功能的实现

    Springboot文件上传功能的实现

    这篇文章主要介绍了SpringBoot文件上传功能的实现,文中通过代码示例介绍的非常详细,具有一定的参考学习价值,需要的朋友们可以参考阅读
    2023-04-04
  • SpringBoot整合Logback日志框架及高并发下的性能优化

    SpringBoot整合Logback日志框架及高并发下的性能优化

    在现代的Java应用开发中,日志记录是不可或缺的一部分,Spring Boot作为目前最流行的Java开发框架之一,默认集成了Logback作为日志框架,Logback是Log4j的继任者,具有更高的性能和更丰富的功能,本文将详细介绍如何在Spring Boot中整合Logback日志框架
    2025-03-03
  • 解决Jenkins集成SonarQube遇到的报错问题

    解决Jenkins集成SonarQube遇到的报错问题

    本文给大家分享Jenkins集成SonarQube遇到的报错问题及解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • jackson json序列化实现首字母大写,第二个字母需小写

    jackson json序列化实现首字母大写,第二个字母需小写

    这篇文章主要介绍了jackson json序列化实现首字母大写,第二个字母需小写方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

    SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

    这篇文章主要介绍了SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java向上向下转型详解

    Java向上向下转型详解

    这篇文章主要为大家详细介绍了Java向上向下转型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • java中编码问题的处理方案

    java中编码问题的处理方案

    这篇文章主要介绍了java中编码问题的处理方案的相关资料,需要的朋友可以参考下
    2015-07-07

最新评论