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;
}

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

总结

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

相关文章

  • Java 指定微信好友自动发送消息的实现示例

    Java 指定微信好友自动发送消息的实现示例

    这篇文章主要介绍了Java 指定微信好友自动发送消息的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • SpringBoot控制台秒变炫彩特效的实现指南

    SpringBoot控制台秒变炫彩特效的实现指南

    本文介绍如何自定义SpringBoot启动横幅,通过banner.txt文件设置ASCII图案、版本号等,并使用ANSI颜色增强效果,还提供关闭默认Banner、添加启动信息及彩色提示的实现方法,需要的朋友可以参考下
    2025-10-10
  • SpringBoot中统计方法耗时的七种实现方式小结

    SpringBoot中统计方法耗时的七种实现方式小结

    作为开发者,我们经常需要统计方法的执行时间,以便找出性能瓶颈,优化系统响应速度,今天分享在SpringBoot框架中实现方法耗时统计的几种方法,大家可以根据需求自行选择
    2025-03-03
  • Java数据结构之队列的简单定义与使用方法

    Java数据结构之队列的简单定义与使用方法

    这篇文章主要介绍了Java数据结构之队列的简单定义与使用方法,简单描述了队列的功能、特点,并结合java实例形式分析了队列的简单定义与使用方法,需要的朋友可以参考下
    2017-10-10
  • 教你用JAVA写文本编辑器(三)

    教你用JAVA写文本编辑器(三)

    这篇文章主要给大家介绍了关于用JAVA写文本编辑器的相关资料,本文主要实现的是一个点击选择文本格式的窗口,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • Java全面细致讲解==和equals的使用

    Java全面细致讲解==和equals的使用

    这篇文章主要介绍了Java中==和equals()的区别,,==可以使用在基本数据类型变量和引用数据类型变量中,equals()是方法,只能用于引用数据类型,需要的朋友可以参考下
    2022-05-05
  • Java 并发编程学习笔记之核心理论基础

    Java 并发编程学习笔记之核心理论基础

    编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的核心理论做了下小结
    2016-05-05
  • Spring boot通过切面,实现超灵活的注解式数据校验过程

    Spring boot通过切面,实现超灵活的注解式数据校验过程

    这篇文章主要介绍了Spring boot通过切面,实现超灵活的注解式数据校验过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • springboot切换使用undertow容器的方式

    springboot切换使用undertow容器的方式

    最近稍微有点空闲,回头再来优化下基础框架,也是一种重新学习。今天主要写写跟大家分享下springboot使用undertow,废话不多说
    2022-07-07
  • MyBatis入门程序

    MyBatis入门程序

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。接下来本文给大家带来了MyBatis入门程序,感兴趣的朋友一起学习吧
    2016-08-08

最新评论