首页 > 解决方案 > 用于获取一年的日期

问题描述

我有一个表,我希望将每一行表示为一个日期以及其他一些列来表示该特定日期的特征。所以,基本上我一年会有 365 行。我需要用 Java 编写一个批处理作业,我将通过一个休息端点触发它。我会将特定年份传递给控制器​​(例如 2020 年)。然后,我想要一种方法,它可以让我在 2020 年获得全部 366 天(因为 2020 年是闰年)以及周末(周六/周日)或工作日(周一至周五)的日子。

我稍后会批量插入那些 366 天的数据库。

在此处输入图像描述

有人可以帮我写这个实用方法。

标签: java

解决方案


要接收给定年份的日期列表,您可以使用以下方法创建如下方法java.time

public static List<LocalDate> getDaysOfYear(int year) {
    // initialize a list of LocalDate
    List<LocalDate> yearDates = new ArrayList<>();
    /*
     * create a year object from the argument
     * to reliably get the amount of days that year has
     */
    Year thatYear = Year.of(year);
    // then just add a LocalDate per day of that year to the list
    for (int dayOfYear = 1; dayOfYear <= thatYear.length(); dayOfYear++) {
        yearDates.add(LocalDate.ofYearDay(year, dayOfYear));
    }
    // and return the list
    return yearDates;
}

您可以使用结果来提取每天的信息(main例如):

public static void main(String[] args) {
    // receive the LocalDates of a given year
    List<LocalDate> yearDates = getDaysOfYear(2020);
    // define a locale for output (language, formats and so on)
    Locale localeToBeUsed = Locale.US;
    
    // then extract information about each date
    for (LocalDate date : yearDates) {
        // or extract the desired parts, like the day of week
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        // the month
        Month month = date.getMonth();
        // the calendar week based on a locale (the one of your system here)
        WeekFields weekFields = WeekFields.of(localeToBeUsed);
        int calendarWeek = date.get(weekFields.weekOfWeekBasedYear());
        // and print the concatenated information (formatted, depending on the locale)
        System.out.println(date.format(DateTimeFormatter.ofPattern("uuuu-MM-dd",
                                                                    localeToBeUsed))
                + ", " + dayOfWeek.getDisplayName(TextStyle.FULL, localeToBeUsed)
                + ", CW " + calendarWeek
                + ", " + month.getDisplayName(TextStyle.FULL, localeToBeUsed));
    }
}

输出将如下所示(为简洁起见,仅包含一些行):

2020-01-01, Wednesday, CW 1, January
...
2020-02-29, Saturday, CW 9, February
...
2020-05-08, Friday, CW 19, May
...
2020-12-31, Thursday, CW 1, December

推荐阅读