繁体   English   中英

从周/月/年获取开始日期和结束日期

[英]Get start date and end date from week/month/year

我需要从给定的年份和星期中提取开始日期和结束日期,并将它们作为 LocalDate 返回:

示例:年/月/周:2022 / 12 / 49 -> date_begin 05/12/2022 - date_end 11/12/2022 这意味着 2022 年的第 49 周从 05/12/2022 开始并在 11/ 结束12/2022。 正如@rzwitserloot 在评论中所说,月份无关紧要。 输入以 int int year = 2022int week = 49的形式提供。

如何做到这一点?

JSR310-extra 有YearWeek ,但更简单的java.time没有——因此,最简单的方法是通过解析器,即使你实际上不需要解析它:

int weekYear = 2022;
int weekNum = 49;
LocalDate monday = LocalDate.parse(String.format("%04d-W%02d-1", weekYear, weekNum), DateTimeFormatter.ISO_WEEK_DATE);
LocalDate sunday = monday.plusDays(6);
System.out.printf("Week %d of year %d runs from %s to %s\n", weekNum, weekYear, monday, sunday);

注意:格式例如为 2022-W49-1; 1 代表“星期一”。 请注意,这是周年:这意味着开始日期可能在上一年(例如,某些年份的第 1 周从上一年的 12 月 30 日开始),或者结束日期可能在下一年。 如果您考虑一下,这是显而易见的(存在从一年开始到下一年结束的周,并且它们必须是某年“周-年”系统的一部分)。 只是想我会强调它:)

此解决方案也有效

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.WeekFields;

public class Main {
    
    public static final WeekFields US_WEEK_FIELDS = WeekFields.of(DayOfWeek.SUNDAY, 4);

    public static void main(String[] args) {
        LocalDate date1 = LocalDate.of(2022, 12, 29);
        LocalDate date2 = LocalDate.now();
        System.out.println(formatDate(date1));
        System.out.println(formatDate(date2));
    }
    
    public static int getWeek(LocalDate date) {
        return date.get(US_WEEK_FIELDS.weekOfWeekBasedYear());
    }
    
    public static int getMonth(LocalDate date) {
        return date.getMonthValue();
    }

    public static int getYear(LocalDate date) {
        return date.get(US_WEEK_FIELDS.weekBasedYear());
    }
    
    public static String formatDate(LocalDate date) {
        int week = getWeek(date);
        int month = getMonth(date);
        int year = getYear(date);
        return year + "/" + month + "/" + week;
    }

}

运行时我进入控制台

2022/12/52
2022/12/49

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM