讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中根据年和周数获取周的起始与结束日期

千宇同学_5078

千宇同学_5078

发布时间:2025-11-24 20:47:00

|

1151人浏览过

|

来源于php中文网

原创

Java中根据年和周数获取周的起始与结束日期

本文详细介绍了如何在java中使用`java.time`包,根据给定的年份和周数,精确计算出该周的起始日期(周一)和结束日期(周日)。通过利用`localdate.parse`方法结合`datetimeformatter.iso_week_date`格式化器,开发者可以高效且准确地处理基于周的日期计算,并理解“周年”概念对日期边界的影响。

在现代应用开发中,根据特定的年份和周数来确定一个星期的起始和结束日期是一个常见的需求,尤其是在报表、日程管理或数据分析场景中。Java 8引入的java.time包(JSR-310)提供了强大且易用的日期时间API,可以优雅地解决此类问题。

核心方法:使用ISO_WEEK_DATE格式解析日期

java.time包中LocalDate类结合DateTimeFormatter.ISO_WEEK_DATE提供了一种简洁而强大的方式来处理基于周的日期计算。ISO_WEEK_DATE格式遵循ISO 8601标准,其模式为YYYY-Www-D,其中YYYY代表年份,Www代表周数(前面带'W'),D代表星期几(1为周一,7为周日)。

要从给定的年份和周数获取周的起始日期(周一)和结束日期(周日),我们可以构造一个符合ISO_WEEK_DATE格式的字符串,然后使用LocalDate.parse()方法进行解析。

步骤详解

  1. 构造格式化字符串: 根据ISO 8601标准,我们需要构建一个形如YYYY-Www-1的字符串来表示该周的周一。这里的1明确指定了我们想要获取的是该周的第一天,即星期一。 String.format("%04d-W%02d-1", year, week)可以帮助我们生成这个字符串,其中%04d确保年份是四位数,%02d确保周数是两位数(不足两位前面补零)。

  2. 解析周一日期: 使用LocalDate.parse(formattedString, DateTimeFormatter.ISO_WEEK_DATE)方法将构造的字符串解析为LocalDate对象,这将得到该周的星期一。

  3. 计算周日日期: 一旦获取了周一的LocalDate对象,只需在其基础上增加6天,即可得到该周的星期日。monday.plusDays(6)方法可以实现这一点。

示例代码

以下是一个完整的Java代码示例,演示如何根据年份和周数获取周的起始和结束日期:

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载

立即学习“Java免费学习笔记(深入)”;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class WeekDateCalculator {

    /**
     * 根据年份和周数获取该周的起始日期(周一)和结束日期(周日)。
     *
     * @param year 年份,例如 2022
     * @param weekNum 周数,例如 49
     * @return 包含起始日期和结束日期的字符串数组,索引0为周一,索引1为周日。
     */
    public static String[] getStartAndEndDateOfWeek(int year, int weekNum) {
        // 1. 构造符合ISO_WEEK_DATE格式的字符串,指定为该周的周一
        String weekMondayString = String.format("%04d-W%02d-1", year, weekNum);

        // 2. 使用DateTimeFormatter.ISO_WEEK_DATE解析周一日期
        LocalDate monday = LocalDate.parse(weekMondayString, DateTimeFormatter.ISO_WEEK_DATE);

        // 3. 计算周日日期(周一加6天)
        LocalDate sunday = monday.plusDays(6);

        // 返回结果
        return new String[]{monday.toString(), sunday.toString()};
    }

    public static void main(String[] args) {
        int year = 2022;
        int week = 49;

        String[] dates = getStartAndEndDateOfWeek(year, week);
        System.out.printf("年份 %d 的第 %d 周从 %s 开始,到 %s 结束。\n",
                          week, year, dates[0], dates[1]);

        // 示例:2022年第49周
        // 预期输出:2022-W49-1 -> 2022-12-05 (周一)
        // 2022-12-05 + 6天 -> 2022-12-11 (周日)

        // 另一个示例:可能跨年的周
        // 2023年第1周,其周一可能在2022年
        year = 2023;
        week = 1;
        dates = getStartAndEndDateOfWeek(year, week);
        System.out.printf("年份 %d 的第 %d 周从 %s 开始,到 %s 结束。\n",
                          week, year, dates[0], dates[1]);
        // 预期输出:2023-W01-1 -> 2023-01-02 (周一)
        // 2023-01-02 + 6天 -> 2023-01-08 (周日)
        // 注意:有些年份的第1周可能从前一年的12月开始,ISO_WEEK_DATE会正确处理
        // 例如,2020年的第1周从2019-12-30开始
        year = 2020;
        week = 1;
        dates = getStartAndEndDateOfWeek(year, week);
        System.out.printf("年份 %d 的第 %d 周从 %s 开始,到 %s 结束。\n",
                          week, year, dates[0], dates[1]);
        // 预期输出:2020-W01-1 -> 2019-12-30 (周一)
        // 2019-12-30 + 6天 -> 2020-01-05 (周日)
    }
}

运行上述代码,对于输入year = 2022, week = 49,将输出: 年份 49 的第 2022 周从 2022-12-05 开始,到 2022-12-11 结束。

对于输入year = 2023, week = 1,将输出: 年份 1 的第 2023 周从 2023-01-02 开始,到 2023-01-08 结束。

对于输入year = 2020, week = 1,将输出: 年份 1 的第 2020 周从 2019-12-30 开始,到 2020-01-05 结束。

注意事项

  1. “周年”概念(Week-Year):DateTimeFormatter.ISO_WEEK_DATE处理的是“周年”(Week-Year)系统,而非简单的日历年。这意味着一周的起始日期可能落在前一个日历年,或者结束日期可能落在下一个日历年。例如,某些年份的第一周(Week 1)可能从前一年的12月30日开始,而某些年份的最后一周(Week 52或53)可能延续到下一年的1月。这种行为是符合ISO 8601标准的,并且对于需要严格按照周进行计算的场景至关重要。

  2. 月份的无关性: 在根据年份和周数确定日期时,月份信息是无关紧要的。因为周数本身就定义了在给定年份中的位置,月份只是日历年的一种划分方式,与周年的计算逻辑不直接相关。

  3. JSR310-extra库: 虽然java.time本身没有直接提供一个YearWeek类,但threeten-extra库(JSR310-extra)中包含了org.threeten.extra.YearWeek,它提供了更面向对象的API来处理年份和周数。如果项目允许引入额外依赖,YearWeek可以提供更高级别的抽象和便利性。然而,对于大多数基础需求,java.time内置的解析方法已足够强大且无需额外依赖。

总结

通过利用java.time.LocalDate和DateTimeFormatter.ISO_WEEK_DATE,我们可以高效、准确地根据年份和周数计算出任意一周的起始(周一)和结束(周日)日期。理解ISO 8601的“周年”概念是正确使用此方法的关键。这种方法不仅代码简洁,而且避免了手动处理复杂的日期逻辑和跨年问题,是Java日期时间处理的推荐实践。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6419

2023.08.02

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

6555

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

342

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

344

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

223

2026.04.17

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn