Вот исходный код моей jsp-страницы:
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8"%>
<%@ page import = "java.time.format.DateTimeFormatter"%>
<%@ page import = "java.time.temporal.TemporalAdjusters"%>
<%@ page import = "java.time.LocalDate"%>
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>Local Date Demo</title>
</head>
<body>
<%
int year=2018,month=12,date=1;
LocalDate theMonthShiftStartDate=LocalDate.of(year,month,date);
LocalDate theMonthShiftEndDate=theMonthShiftStartDate.with(TemporalAdjusters.lastDayOfMonth());
LocalDate previousMonthShiftStartDate=theMonthShiftStartDate.plusMonths(-1);
LocalDate previousMonthShiftEndDate=previousMonthShiftStartDate.with(TemporalAdjusters.lastDayOfMonth());
%>
theMonthShiftStartDate=<%=theMonthShiftStartDate.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))%><br>
theMonthShiftEndDate=<%=theMonthShiftEndDate.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))%><br>
previousMonthShiftStartDate=<%=previousMonthShiftStartDate.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))%><br>
previousMonthShiftEndDate=<%=previousMonthShiftEndDate.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))%><br>
</body>
</html>
Почему вывод следующий:
theMonthShiftStartDate=2018-12-01
theMonthShiftEndDate=2019-12-31
previousMonthShiftStartDate=2018-11-01
previousMonthShiftEndDate=2018-11-30
Я ожидал, что «theMonthShiftEndDate» должен быть 2018-12-31, однако он возвращает 2019-12-31.
Согласно Javadoc:
TemporalAdjusters.lastDayOfMonth()
Возвращает регулятор «последний день месяца», который возвращает новую дату, установленную на последний день текущего месяца.
Я запускаю jsp сегодня, почему проблема возникает только в объекте localdate «декабрь», а не в ноябре?




См. Википедию на дни недели.
Examples:
Monday 29 December 2008 is written "2009-W01-1"
Sunday 3 January 2010 is written "2009-W53-7"
Вы написали
DateTimeFormatter.ofPattern("YYYY-MM-dd"))
с шаблоном YYYY вы форматируете, используя недельный год.
Измените шаблон на yyyy-MM-dd, в котором используется год эры.
DateTimeFormatter.ofPattern("yyyy-MM-dd"))
Если вы уверены, что вам всегда нужен формат
2018-12-31(формат ISO 8601), вам не нужно указывать форматтер.theMonthShiftStartDate.toString()даст вам то, что вы хотите (аналогично для других переменныхLocalDate).