从上面的图像。。。对于日历视图,每个月包括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()); }
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));
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));
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));
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("|"); }}
static void printCalendar(YearMonth yearMonth, Locale locale) {
// Determine calendar first and last dates
LocalDate firstDate = yearMonth.atDay(1).with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
// 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());
测试
printCalendar(YearMonth.of(2019, Month.FEBRUARY), Locale.US);printCalendar(YearMonth.of(2019, Month.FEBRUARY), Locale.FRANCE);
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 |
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 |
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 |
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 |
注意,美国版本是从周日开始的,而法国版本是从周一开始的。
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月的前两天。