【问题标题】:How can I get list of years, months and weeks in Java?如何在 Java 中获取年、月和周的列表?
【发布时间】:2017-05-03 10:19:54
【问题描述】:

我正在尝试获取自 1970 年、1971 年、1972 年、1973 年等到 2017 年以来的年份列表,以及 1 月至 12 月的月份列表 在此之后根据月份和年份生成周数(基于周一至周五的工作日)。

如果一个月从星期四开始,即 2016 年 2 月 2 日

那么它应该返回 2-2-2016, 3-2-2016

假设一个用例是月末日是星期二,其日期是 2016 年 4 月 30 日

那么我应该得到 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 天得到第 2 周的第一天。

  5. 增加 5 天以获得第二周星期五

  6. 同样持续到月底

【问题讨论】:

  • 有点难以理解你想要做什么。你想得到纪元以来的年份吗?如果是这样,为什么?有像 Joda 甚至 Calendar 这样的库,它们可能已经做了你想要的,不需要自己创建这些函数。那么,你能详细说明你想做什么吗?
  • 不,我想这样做...... 1970 , 1971, 1972, 1973 等到 2017 年以及 1 月至 12 月的几个月列表(我还是硬编码了这个)然后计算周
  • 我解决了年表和月表问题。现在唯一剩下的就是计算周数了
  • 天哪,对不起,虽然我解决了所有问题,但我很奇怪为什么我得到了这么多反对票,我在这里写的时候搞砸了日期。

标签: java calendar java-8


【解决方案1】:

这是一个代码sn-p:

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,因为它不使用确切的日期。或者您可能想要更改它,以便它以某种方式使用确切的日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多