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

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


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

q0qdq0h2

q0qdq0h21#

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

  1. public static List<LocalDate> getDatesBetweenUsingJava8(
  2. LocalDate startDate, LocalDate endDate) {
  3. long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
  4. return IntStream.iterate(0, i -> i + 1)
  5. .limit(numOfDaysBetween)
  6. .mapToObj(i -> startDate.plusDays(i))
  7. .collect(Collectors.toList());
  8. }

然后打印所有日期:

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

twh00eeo2#

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

  1. Calendar calendar = Calendar.getInstance();
  2. calendar.set(2021, 5, 1);
  3. if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
  4. calendar.add(Calendar.DATE, -7);
  5. } else {
  6. calendar.add(Calendar.DATE, 1 - calendar.get(Calendar.DAY_OF_WEEK));
  7. }
  8. System.out.println("First Date of Month :: " + calendar.get(Calendar.DATE));
  9. calendar.add(Calendar.DATE, 41);
  10. System.out.println("Last Date of Month :: " + calendar.get(Calendar.DATE));
inkz8wg9

inkz8wg93#

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

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

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

  1. LocalDate lastDate = firstDate.plusDays(41);

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

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

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

  1. static void printCalendar(YearMonth yearMonth, Locale locale) {
  2. // Determine calendar first and last dates
  3. DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
  4. LocalDate firstDate = yearMonth.atDay(1).with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
  5. LocalDate lastDate = firstDate.plusDays(41);
  6. // Calculate column width
  7. int width = Stream.of(DayOfWeek.values())
  8. .mapToInt(d -> d.getDisplayName(TextStyle.SHORT, locale).length())
  9. .max().getAsInt();
  10. // Print title (month year)
  11. String title = yearMonth.format(DateTimeFormatter.ofPattern("MMMM uuuu", locale));
  12. System.out.printf("%" + ((3 + width) * 7 + 1 - title.length()) / 2 + "s%s%n", "", title);
  13. // Print day names
  14. for (int days = 0; days < 7; days++)
  15. System.out.printf("| %" + width + "s ", firstDayOfWeek.plus(days).getDisplayName(TextStyle.SHORT, locale));
  16. System.out.println("|");
  17. // Print date numbers
  18. for (LocalDate date = firstDate; date.compareTo(lastDate) <= 0; ) {
  19. for (int i = 0; i < 7; i++, date = date.plusDays(1))
  20. System.out.printf("| %" + width + "d ", date.getDayOfMonth());
  21. System.out.println("|");
  22. }
  23. }

测试

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

输出

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

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

展开查看全部
bprjcwpo

bprjcwpo4#

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

相关问题