从上面的图像。。。对于日历视图,每个月包括42个日期。它还包括上个月和下个月的日期。如何获得第一个和最后一个日期为给定的月份根据上面的图片,其中将包括下一个月和上一个月的日期。例如,上图中的月份是2019年2月…但第一天是1月27日,最后一天是3月9日。如何使用Java8日历类或任何其他类来查找这些日期?
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)));
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));
inkz8wg93#
要获取日历的第一个日期,您需要获取最接近的一周的第一天(星期日或星期一),即给定日历月(年+月)的每月第一天当天或之前。要指定日历月,请使用 YearMonth 班级。要确定一周的第一天,请使用 WeekFields 班级。要查找给定日期当天或之前的星期几,请使用 TemporalAdjusters.previousOrSame() 方法。这意味着:
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 |
注意,美国版本是从周日开始的,而法国版本是从周一开始的。
bprjcwpo4#
以每月第一天的工作日为例。那你就知道还有多少天了。在你的照片里,二月一日是星期五。一周中有5天是星期五之前(如果你的一周从星期天开始)。所以你把一月份的最后5天也算进去。月底也一样。在你的照片中,2月27日是星期四,所以你需要3月的前两天。
4条答案
按热度按时间q0qdq0h21#
像这里一样吗https://www.baeldung.com/java-between-dates:
然后打印所有日期:
twh00eeo2#
这是我的问题解决方案…我测试了多个案例…工作正常。。有人能告诉我这是否行得通吗?如果没有,为什么?
inkz8wg93#
要获取日历的第一个日期,您需要获取最接近的一周的第一天(星期日或星期一),即给定日历月(年+月)的每月第一天当天或之前。
要指定日历月,请使用
YearMonth
班级。要确定一周的第一天,请使用
WeekFields
班级。要查找给定日期当天或之前的星期几,请使用
TemporalAdjusters.previousOrSame()
方法。这意味着:
由于您在日历中显示42天,即总是6周,所以最后一个日期很简单:
如果您希望只显示所需的周数,请按照计算第一个日期的方式进行计算:
要看到它的效果,让我们打印日历。打印一个完整的日历是相当容易的,但是如果你想用一种给定的语言打印的话会稍微复杂一些,因为我们必须自动调整日历的宽度,但是可以这样做:
测试
输出
注意,美国版本是从周日开始的,而法国版本是从周一开始的。
bprjcwpo4#
以每月第一天的工作日为例。那你就知道还有多少天了。在你的照片里,二月一日是星期五。一周中有5天是星期五之前(如果你的一周从星期天开始)。所以你把一月份的最后5天也算进去。
月底也一样。在你的照片中,2月27日是星期四,所以你需要3月的前两天。