簡體   English   中英

如何在 Java 中獲取年、月和周的列表?

[英]How can I get list of years, months and weeks in Java?

我正在嘗試獲取自紀元以來的年份列表,即 1970 、 1971、 1972、 1973 等到 2017 ,並根據月份和年份在此之后的 1 月 - 12 月列表生成周(基於周一至周五的工作日)。

如果一個月從星期四開始,即 2-2-2016

那么它應該返回 2-2-2016, 3-2-2016

一個用例是假設月末日是星期二,日期是 30-4-2016

那么我應該得到 29-4-2016, 30-4-2016

到目前為止,我只能從輸入日期獲得同一周的最后一個工作日,代碼如下:

String Date = "06-04-2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern("YYYY-MM-DD");
LocalDate ld = LocalDate.parse(Date, f);

LocalDate nextOrSameFriday = ld.with(TemporalAdjusters
        .nextOrSame(DayOfWeek.FRIDAY));
String output = nextOrSameFriday.toString();
//String output = ld.format( f );

if (nextOrSameFriday.getMonthValue() != ld.getMonthValue()) {
    nextOrSameFriday = ld.with(TemporalAdjusters
            .nextOrSame(DayOfWeek.THURSDAY));
    if (nextOrSameFriday.getMonthValue() == ld.getMonthValue())
        return nextOrSameFriday.toString();

    else if (nextOrSameFriday.getMonthValue() != ld.getMonthValue()) {
        nextOrSameFriday = ld.with(TemporalAdjusters
                .nextOrSame(DayOfWeek.WEDNESDAY));

        if (nextOrSameFriday.getMonthValue() == ld.getMonthValue())
            return nextOrSameFriday.toString();

        else if (nextOrSameFriday.getMonthValue() != ld.getMonthValue()) {
            nextOrSameFriday = ld.with(TemporalAdjusters
                    .nextOrSame(DayOfWeek.TUESDAY));
            if (nextOrSameFriday.getMonthValue() == ld.getMonthValue())
                return nextOrSameFriday.toString();
            else
                return Date;

        }

    }

}

選擇月份和年份后,我希望執行以下操作:

  1. 查找本月的第一天

  2. 查找 MONTH 的第一個星期五

  3. 檢查是周六還是周日,在 DATE 中添加 1 或 2

  4. 在第一個星期五添加 2 天以獲得第二周的第一天。

  5. 添加 5 天以獲得第 2 周星期五

  6. 同樣一直持續到月底

與其試圖解釋,我認為編寫代碼片段更簡單,它還提供了更高的精度:

private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("d-M-uuuu");

public static void printWorkWeeksOfMonth(String date) {
    LocalDate ld = LocalDate.parse(date, DATE_FORMAT);
    LocalDate lastDayOfMonth = ld.with(TemporalAdjusters.lastDayOfMonth());
    
    // find first working day of month; also first working day of first work week
    LocalDate firstWorkingDay = ld.withDayOfMonth(1);
    if (ld.getDayOfWeek() == DayOfWeek.SATURDAY || ld.getDayOfWeek() == DayOfWeek.SUNDAY) {
        firstWorkingDay = firstWorkingDay.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    }
    while (! firstWorkingDay.isAfter(lastDayOfMonth)) {
        // find last working day of week beginning on firstWorkingDay
        LocalDate lastWorkingDay = firstWorkingDay.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
        if (lastWorkingDay.isAfter(lastDayOfMonth)) {
            // end work week at end of month
            lastWorkingDay = lastDayOfMonth;
        }
        System.out.println(firstWorkingDay.format(DATE_FORMAT)
                + " through " + lastWorkingDay.format(DATE_FORMAT));
        
        // find beginning of next work week
        firstWorkingDay = firstWorkingDay.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    }
}

如果我將2-2-2016輸入上述方法,它會打印:

1-2-2016 through 5-2-2016
8-2-2016 through 12-2-2016
15-2-2016 through 19-2-2016
22-2-2016 through 26-2-2016
29-2-2016 through 29-2-2016

鑒於29-4-2016它打印:

1-4-2016 through 1-4-2016
4-4-2016 through 8-4-2016
11-4-2016 through 15-4-2016
18-4-2016 through 22-4-2016
25-4-2016 through 29-4-2016

換句話說,該方法將date所屬月份的工作周打印到標准輸出。 您可能希望更改方法以接受YearMonth而不是String因為它不使用確切日期。 或者您可能想要更改它,以便以某種方式使用確切的日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM