In Java 8, you can use the predefined java.time.temporal.TemporalAdjusters to adjust a date or Temporal
1. TemporalAdjusters
Example to move a date to firstDayOfMonth, firstDayOfNextMonth, next Monday and etc.
TestDate.java
package com.favtuts.time;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class TemporalAdjustersExamples {
public static void main(String[] args) {
demoTemporalAdjusters();
}
static void demoTemporalAdjusters() {
LocalDate localDate = LocalDate.now();
System.out.println("current date : " + localDate);
LocalDate with = localDate.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("firstDayOfMonth : " + with);
LocalDate with1 = localDate.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("lastDayOfMonth : " + with1);
LocalDate with2 = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("next monday : " + with2);
LocalDate with3 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println("firstDayOfNextMonth : " + with3);
}
}
Output
current date : 2022-06-05
firstDayOfMonth : 2022-06-01
lastDayOfMonth : 2022-06-30
next monday : 2022-06-06
firstDayOfNextMonth : 2022-07-01
Note
Please check this official TemporalAdjusters JavaDoc for the entire list of the predefined TemporalAdjusters.
2. Custom TemporalAdjuster
Example to implement TemporalAdjuster to move a date to next Christmas.
NextChristmas.java
package com.favtuts.time;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
public class NextChristmasAdjuster implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
return temporal.with(ChronoField.MONTH_OF_YEAR, 12).with(ChronoField.DAY_OF_MONTH, 25);
}
}
TestDate.java
package com.favtuts.time;
import java.time.LocalDate;
public class TemporalAdjustersExamples {
public static void main(String[] args) {
demoCustomTemporalAdjuster();
}
static void demoCustomTemporalAdjuster() {
LocalDate localDate = LocalDate.now();
System.out.println("current date : " + localDate);
localDate = localDate.with(new NextChristmasAdjuster());
System.out.println("Next Christmas : " + localDate);
}
}
Output
current date : 2022-06-05
Next Christmas : 2022-12-25
Alternatively, you can use the following lambda expression :
localDate = localDate.with(
temporal -> temporal.with(ChronoField.MONTH_OF_YEAR, 12).with(ChronoField.DAY_OF_MONTH, 25)
);
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-basic/time