如何获得月的最小和最大日期?

gpfsuwkq  于 2021-07-06  发布在  Java
关注(0)|答案(4)|浏览(350)


从上面的图像。。。对于日历视图,每个月包括42个日期。它还包括上个月和下个月的日期。
如何获得第一个和最后一个日期为给定的月份根据上面的图片,其中将包括下一个月和上一个月的日期。
例如,上图中的月份是2019年2月…但第一天是1月27日,最后一天是3月9日。
如何使用Java8日历类或任何其他类来查找这些日期?

q0qdq0h2

q0qdq0h21#

像这里一样吗https://www.baeldung.com/java-between-dates:

public static List<LocalDate> getDatesBetweenUsingJava8(
            LocalDate startDate, LocalDate endDate) {

        long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
        return IntStream.iterate(0, i -> i + 1)
                .limit(numOfDaysBetween)
                .mapToObj(i -> startDate.plusDays(i))
                .collect(Collectors.toList());
    }

然后打印所有日期:

System.out.println(getDatesBetweenUsingJava8(LocalDate.now(), LocalDate.now().plusDays(42)));
twh00eeo

twh00eeo2#

这是我的问题解决方案…我测试了多个案例…工作正常。。有人能告诉我这是否行得通吗?如果没有,为什么?

Calendar calendar = Calendar.getInstance();
    calendar.set(2021, 5, 1);

    if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
        calendar.add(Calendar.DATE, -7);
    } else {
        calendar.add(Calendar.DATE, 1 - calendar.get(Calendar.DAY_OF_WEEK));
    }

    System.out.println("First Date of Month :: " + calendar.get(Calendar.DATE));

    calendar.add(Calendar.DATE, 41);

    System.out.println("Last Date of Month :: " + calendar.get(Calendar.DATE));
inkz8wg9

inkz8wg93#

要获取日历的第一个日期,您需要获取最接近的一周的第一天(星期日或星期一),即给定日历月(年+月)的每月第一天当天或之前。
要指定日历月,请使用 YearMonth 班级。
要确定一周的第一天,请使用 WeekFields 班级。
要查找给定日期当天或之前的星期几,请使用 TemporalAdjusters.previousOrSame() 方法。
这意味着:

DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
LocalDate firstDate = yearMonth.atDay(1)
                               .with(TemporalAdjusters.previousOrSame(firstDayOfWeek));

由于您在日历中显示42天,即总是6周,所以最后一个日期很简单:

LocalDate lastDate = firstDate.plusDays(41);

如果您希望只显示所需的周数,请按照计算第一个日期的方式进行计算:

DayOfWeek lastDayOfWeek = firstDayOfWeek.minus(1);
LocalDate lastDate = yearMonth.atEndOfMonth()
                              .with(TemporalAdjusters.nextOrSame(lastDayOfWeek));

要看到它的效果,让我们打印日历。打印一个完整的日历是相当容易的,但是如果你想用一种给定的语言打印的话会稍微复杂一些,因为我们必须自动调整日历的宽度,但是可以这样做:

static void printCalendar(YearMonth yearMonth, Locale locale) {
    // Determine calendar first and last dates
    DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
    LocalDate firstDate = yearMonth.atDay(1).with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
    LocalDate lastDate = firstDate.plusDays(41);

    // Calculate column width
    int width = Stream.of(DayOfWeek.values())
                      .mapToInt(d -> d.getDisplayName(TextStyle.SHORT, locale).length())
                      .max().getAsInt();

    // Print title (month year)
    String title = yearMonth.format(DateTimeFormatter.ofPattern("MMMM uuuu", locale));
    System.out.printf("%" + ((3 + width) * 7 + 1 - title.length()) / 2 + "s%s%n", "", title);

    // Print day names
    for (int days = 0; days < 7; days++)
        System.out.printf("| %" + width + "s ", firstDayOfWeek.plus(days).getDisplayName(TextStyle.SHORT, locale));
    System.out.println("|");

    // Print date numbers
    for (LocalDate date = firstDate; date.compareTo(lastDate) <= 0; ) {
        for (int i = 0; i < 7; i++, date = date.plusDays(1))
            System.out.printf("| %" + width + "d ", date.getDayOfMonth());
        System.out.println("|");
    }
}

测试

printCalendar(YearMonth.of(2019, Month.FEBRUARY), Locale.US);
printCalendar(YearMonth.of(2019, Month.FEBRUARY), Locale.FRANCE);

输出

February 2019
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|  27 |  28 |  29 |  30 |  31 |   1 |   2 |
|   3 |   4 |   5 |   6 |   7 |   8 |   9 |
|  10 |  11 |  12 |  13 |  14 |  15 |  16 |
|  17 |  18 |  19 |  20 |  21 |  22 |  23 |
|  24 |  25 |  26 |  27 |  28 |   1 |   2 |
|   3 |   4 |   5 |   6 |   7 |   8 |   9 |
février 2019
| lun. | mar. | mer. | jeu. | ven. | sam. | dim. |
|   28 |   29 |   30 |   31 |    1 |    2 |    3 |
|    4 |    5 |    6 |    7 |    8 |    9 |   10 |
|   11 |   12 |   13 |   14 |   15 |   16 |   17 |
|   18 |   19 |   20 |   21 |   22 |   23 |   24 |
|   25 |   26 |   27 |   28 |    1 |    2 |    3 |
|    4 |    5 |    6 |    7 |    8 |    9 |   10 |

注意,美国版本是从周日开始的,而法国版本是从周一开始的。

bprjcwpo

bprjcwpo4#

以每月第一天的工作日为例。那你就知道还有多少天了。在你的照片里,二月一日是星期五。一周中有5天是星期五之前(如果你的一周从星期天开始)。所以你把一月份的最后5天也算进去。
月底也一样。在你的照片中,2月27日是星期四,所以你需要3月的前两天。

相关问题