Об использовании TemporalAdjusters.lastDayOfMonth()

Вот исходный код моей 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 «декабрь», а не в ноябре?

Если вы уверены, что вам всегда нужен формат 2018-12-31 (формат ISO 8601), вам не нужно указывать форматтер. theMonthShiftStartDate.toString() даст вам то, что вы хотите (аналогично для других переменных LocalDate).

Ole V.V. 07.04.2019 09:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
243
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. Википедию на дни недели.

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"))

Другие вопросы по теме