date - Como gerar um valor contendo a "última sexta-feira do mês" usando LocalDate do Java? - Stack Overflow em Português
Estou recebendo dados de um arquivo CSV com alguns dados, e um desses dados contém datas aleatórias no seguinte formato: mm/YYYY.
Eu tenho um parâmetro private LocalDate date. E a partir da data gerada, gostaria de criar uma com a última sexta-feira do mês.
Você pode usar a classe java.time.temporal.TemporalAdjusters, que possui o método lastInMonth, passando como parâmetro um java.time.DayOfWeek correspondente à sexta-feira. Ex:
Um ponto importante é que as classes da API java.time são imutáveis. Isso quer dizer que métodos que modificam alguma informação (como o método with acima) sempre retornam outra instância, por isso não se deve esquecer de guardar o valor retornado em alguma variável. Se quiser, pode usar inclusive a mesma:
Mas repare que LocalDate exige que se tenha o dia, mês e ano. Como no seu CSV só existe o mês e o ano, não é possível criar um LocalDate diretamente (a menos que você artificialmente coloque algum valor para o dia).
Uma alternativa é fazer o parsing da sua string no formato "mm/yyyy" para um java.time.YearMonth, que é uma classe que possui apenas o mês e o ano. E para transformar uma String em YearMonth, usamos um java.time.format.DateTimeFormatter:
Primeiro eu crio o DateTimeFormatter indicando o formato da String (no caso, "mês/ano"). Atenção para usar M maiúsculo e y minúsculo, pois isso faz diferença (veja na documentação que m minúsculo e Y maiúsculo representam campos diferentes, e se você usá-los erroneamente, não vai funcionar).
Depois eu uso o método YearMonth.parse para criar o YearMonth correspondente. Esta classe só possui o mês e ano, sem qualquer informação sobre o dia. No caso, a instância obtida corresponde à janeiro de 2019.
Em seguida eu seto um dia arbitrário (usando o método atDay), para criar um LocalDate. No caso, usei o dia 1, pois é um valor mais garantido que todos os meses têm (se eu usar o dia 31, por exemplo, nem todos os meses têm e isso pode dar erro).