openplanning

Hướng dẫn và ví dụ Java TemporalAdjusters

Xem thêm các chuyên mục:

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

1- TemporalAdjusters

Lớp TemporalAdjusters cung cấp các phương thức tĩnh để có được các đối tượng TemporalAdjuster thông dụng và hữu ích, chẳng hạn:
  • Tìm kiếm ngày đầu tiên hoặc cuối cùng của tháng.
  • Tìm kiếm ngày đầu tiên của tháng tiếp theo.
  • Tìm kiếm ngày đầu tiên hoặc cuối cùng của năm.
  • Tìm kiếm ngày đầu tiên của năm tiếp theo.
  • Tìm kiếm "ngày trong tuần" (day-of-week) đầu tiên hoặc cuối cùng trong một tháng, chẳng hạn "Thứ tư đầu tiên của tháng sáu".
  • Tìm kiếm "ngày trong tuần" (day-of-week) trước hoặc tiếp theo, chẳng hạn "Thứ năm tiếp theo".
Xem thêm bài viết về interface TemporalAdjuster với các ví dụ cơ bản và tuỳ biến TemporalAdjuster:

2- TemporalAdjusters Methods

Tất cả các phương thức được cung cấp bởi TemporalAdjusters đều là tĩnh và trả về một đối tượng TemporalAdjuster.

public static TemporalAdjuster ofDateAdjuster(UnaryOperator<LocalDate> dateBasedAdjuster)

public static TemporalAdjuster firstDayOfMonth()  
public static TemporalAdjuster lastDayOfMonth()  

public static TemporalAdjuster firstDayOfNextMonth()  

public static TemporalAdjuster firstDayOfYear()  
public static TemporalAdjuster lastDayOfYear()  

public static TemporalAdjuster firstDayOfNextYear()

public static TemporalAdjuster firstInMonth(DayOfWeek dayOfWeek)  
public static TemporalAdjuster lastInMonth(DayOfWeek dayOfWeek)  

public static TemporalAdjuster dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)

public static TemporalAdjuster next(DayOfWeek dayOfWeek)   
public static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek)  

public static TemporalAdjuster previous(DayOfWeek dayOfWeek)   
public static TemporalAdjuster previousOrSame(DayOfWeek dayOfWeek) 

3- ofDateAdjuster(UnaryOperator<LocalDate>)

Phương thức này trả về một đối tượng TemporalAdjuster để điều chỉnh phần LocalDate của một đối tượng Temporal, các phần khác của đối tượng Temporal không thay đổi.

public static TemporalAdjuster ofDateAdjuster(UnaryOperator<LocalDate> dateBasedAdjuster) {
    Objects.requireNonNull(dateBasedAdjuster, "dateBasedAdjuster");
    return (temporal) -> {
        LocalDate input = LocalDate.from(temporal);
        LocalDate output = dateBasedAdjuster.apply(input);
        return temporal.with(output);
    };
}
Chẳng hạn, thêm 2 ngày vào một đối tượng Temporal:
Temporal Example After 2 days
ZonedDateTime 2020-05-25T13:30:59+6[Asia/Bishkek] 2020-05-27T13:30:59+6[Asia/Bishkek]
OffsetDateTime 2020-05-25T13:30:59+6 2020-05-27T13:30:59+6
LocalDateTime 2020-05-25T13:30:59 2020-05-27T13:30:59
Ví dụ: Một TemporalAdjuster để thêm vào 2 ngày.
TemporalAdjusters_ofDateAdjuster_ex1.java

package org.o7planning.temporaladjusters.ex;

import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class TemporalAdjusters_ofDateAdjuster_ex1 {
    public static void main(String[] args) {
        TemporalAdjuster add2DaysAdjuster = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(2));
        
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        ZonedDateTime after2Days = zonedDateTime.with(add2DaysAdjuster);
        
        System.out.println("zonedDateTime: " + zonedDateTime);
        System.out.println("after2Days: " + after2Days);
    }
}
Output:

zonedDateTime: 2021-07-05T18:53:19.138987+06:00[Asia/Bishkek]
after2Days: 2021-07-07T18:53:19.138987+06:00[Asia/Bishkek]
  • TODO Link?

4- firstDayOfMonth()

Trả về một TemporalAdjuster - "ngày đầu tiên trong tháng".

public static TemporalAdjuster firstDayOfMonth()  
Ví dụ:
TemporalAdjusters_firstDayOfMonth_ex1.java

LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfMonth = (LocalDate) TemporalAdjusters.firstDayOfMonth().adjustInto(localDate);
System.out.println("firstDayOfMonth: " + firstDayOfMonth);

DayOfWeek dayOfWeek = firstDayOfMonth.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:

today is: 2021-07-05
firstDayOfMonth: 2021-07-01
 > day of week: THURSDAY
  • TODO Link?

5- lastDayOfMonth()

Trả về một TemporalAdjuster - "ngày cuối cùng trong tháng".
 

public static TemporalAdjuster lastDayOfMonth()  
Ví dụ:
TemporalAdjusters_lastDayOfMonth_ex1.java

LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate lastDayOfMonth = (LocalDate) TemporalAdjusters.lastDayOfMonth().adjustInto(localDate);
System.out.println("lastDayOfMonth: " + lastDayOfMonth);

DayOfWeek dayOfWeek = lastDayOfMonth.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:

today is: 2021-07-05
lastDayOfMonth: 2021-07-31
 > day of week: SATURDAY
  • TODO Link?

6- firstDayOfNextMonth()

Trả về một TemporalAdjuster - "ngày đầu tiên trong tháng tiếp theo".

public static TemporalAdjuster firstDayOfNextMonth()  
Ví dụ:
TemporalAdjusters_firstDayOfNextMonth_ex1.java

LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfNextMonth = (LocalDate) localDate.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println("firstDayOfNextMonth: " + firstDayOfNextMonth);

DayOfWeek dayOfWeek = firstDayOfNextMonth.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);

int dayOfMonth = firstDayOfNextMonth.getDayOfMonth();
System.out.println(" > day of month: " + dayOfMonth);
Output:

today is: 2021-07-05
firstDayOfNextMonth: 2021-08-01
 > day of week: SUNDAY
 > day of month: 1

7- firstDayOfYear()

Trả về một TemporalAdjuster - "ngày đầu tiên trong năm".
 

public static TemporalAdjuster firstDayOfYear()  
Ví dụ:
TemporalAdjusters_firstDayOfYear_ex1.java

LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfYear = (LocalDate) localDate.with(TemporalAdjusters.firstDayOfYear());
System.out.println("firstDayOfYear: " + firstDayOfYear);

DayOfWeek dayOfWeek = firstDayOfYear.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:

today is: 2021-07-05
firstDayOfYear: 2021-01-01
 > day of week: FRIDAY

8- lastDayOfYear()

Trả về một TemporalAdjuster - "ngày cuối cùng trong năm".

public static TemporalAdjuster lastDayOfYear() 
Ví dụ:
TemporalAdjusters_lastDayOfYear_ex1.java

LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate lastDayOfYear = (LocalDate) localDate.with(TemporalAdjusters.lastDayOfYear());
System.out.println("lastDayOfYear: " + lastDayOfYear);

DayOfWeek dayOfWeek = lastDayOfYear.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:

today is: 2021-07-05
lastDayOfYear: 2021-12-31
 > day of week: FRIDAY

9- firstDayOfNextYear()

Trả về một TemporalAdjuster - "ngày đầu tiên trong năm tiếp theo".

public static TemporalAdjuster firstDayOfNextYear()
Ví dụ:
TemporalAdjusters_firstDayOfNextYear_ex1.java

LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfNextYear = (LocalDate) localDate.with(TemporalAdjusters.firstDayOfNextYear());
System.out.println("firstDayOfNextYear: " + firstDayOfNextYear);

DayOfWeek dayOfWeek = firstDayOfNextYear.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);

int dayOfYear = firstDayOfNextYear.getDayOfYear();
System.out.println(" > day of year: " + dayOfYear);
Output:

today is: 2021-07-05
firstDayOfNextYear: 2022-01-01
> day of week: SATURDAY
> day of year: 1

10- firstInMonth(DayOfWeek)

Trả về một TemporalAdjuster - "Ngày trong tuần (day-of-week) đầu tiên trong tháng". Chẳng hạn, tìm ngày thứ hai (MONDAY) đầu tiên trong tháng.

public static TemporalAdjuster firstInMonth(DayOfWeek dayOfWeek)  
Hiện nay tại Mỹ, ngày bắt đầu DST là ngày chủ nhật thứ hai của tháng 3 và kết thúc là ngày chủ nhật đầu tiên của tháng 11. Câu hỏi là ngày bắt đầu DST năm 2025 tại Mỹ là ngày nào?
TemporalAdjusters_firstInMonth_ex1.java

// Find the first SUNDAY in month.
TemporalAdjuster adjuster1 = TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY);
// Find the next SUNDAY
TemporalAdjuster adjuster2 = TemporalAdjusters.next(DayOfWeek.SUNDAY);

LocalDate localDate = LocalDate.of(2025, 3, 1); // 2025-03-01

LocalDate firstSundayInMonth = (LocalDate) localDate.with(adjuster1);
LocalDate secondSundayInMonth = (LocalDate) firstSundayInMonth.with(adjuster2);

System.out.println("firstSaturdayInMonth: " + firstSundayInMonth); // 2025-03-02
System.out.println("secondSundayInMonth: " + secondSundayInMonth);  // 2025-03-09

11- lastInMonth(DayOfWeek)

Trả về một TemporalAdjuster - "Ngày trong tuần (day-of-week) cuối cùng trong tháng". Chẳng hạn, tìm ngày thứ hai (MONDAY) cuối cùng của tháng.

public static TemporalAdjuster lastInMonth(DayOfWeek dayOfWeek)  
Ví dụ: Tìm ngày chủ nhật cuối cùng của tháng hiện tại:
TemporalAdjusters_lastInMonth_ex1.java

// Find the last SUNDAY in month.
TemporalAdjuster adjuster = TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY);  

LocalDate localDate = LocalDate.now();
System.out.println("Today is: " + localDate);

LocalDate lastSundayInMonth = (LocalDate) localDate.with(adjuster);  
System.out.println("lastSundayInMonth: " + lastSundayInMonth); 
Output:

Today is: 2021-07-05
lastSundayInMonth: 2021-07-25

12- dayOfWeekInMonth(int, DayOfWeek)

Trả về một TemporalAdjuster - "ngày trong tuần (day-of-week) thứ ordinal trong tháng". Chẳng hạn, tìm ngày thứ hai (MONDAY) thứ 3 trong tháng.

public static TemporalAdjuster dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
Ví dụ: Tìm ngày chủ nhật (SUNDAY) thứ hai của tháng 3 năm 2025 (Ngày bắt đầu DST năm 2025 tại Mỹ).
TemporalAdjusters_dayOfWeekInMonth_ex1.java

// Find the second SUNDAY in month.
TemporalAdjuster adjuster = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY);  

LocalDate localDate = LocalDate.of(2025, 3, 1); // 2025-03-01
 
LocalDate secondSundayInMonth = (LocalDate) localDate.with(adjuster);   
System.out.println("secondSundayInMonth: " + secondSundayInMonth);  // 2025-03-09

13- next(DayOfWeek)

Trả về một TemporalAdjuster - "ngày trong tuần (day-of-week) tiếp theo". Chẳng hạn, tìm ngày thứ hai (MONDAY) tiếp theo.

public static TemporalAdjuster next(DayOfWeek dayOfWeek)  
Ví dụ: Tìm thứ hai (MONDAY) tiếp theo.
TemporalAdjusters_next_ex1.java

// Find the next MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.next(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Next MONDAY.
LocalDate nextMonday = localDate.with(adjuster);
 
System.out.println("nextMonday: " + nextMonday);  // 2021-07-12
System.out.println("nextMonday.getDayOfWeek(): " + nextMonday.getDayOfWeek());  // MONDAY
Output:

localDate: 2021-07-05
localDate.getDayOfWeek(): MONDAY
nextMonday: 2021-07-12
nextMonday.getDayOfWeek(): MONDAY

14- nextOrSame(DayOfWeek)

Trả về một TemporalAdjuster - "ngày trong tuần (day-of-week) tương tự hoặc tiếp theo".

public static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek)  
Ví dụ: Trả về ngày này nếu nó là thứ hai, ngược lại trả về ngày thứ hai tiếp theo.
TemporalAdjusters_nextOrSame_ex1.java

// Find the next or same MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Next or same MONDAY.
LocalDate nextOrSameMonday = localDate.with(adjuster);
 
System.out.println("nextOrSameMonday: " + nextOrSameMonday);  // 2021-07-05
System.out.println("nextOrSameMonday.getDayOfWeek(): " + nextOrSameMonday.getDayOfWeek());  // MONDAY

15- previous(DayOfWeek)

Trả về một TemporalAdjuster - "ngày trong tuần (day-of-week) trước đó". Chẳng hạn, tìm ngày thứ hai (MONDAY) trước đó.

public static TemporalAdjuster previous(DayOfWeek dayOfWeek)  
Ví dụ: Tìm thứ hai (MONDAY) trước đó.
TemporalAdjusters_previous_ex1.java

// Find the previous MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.previous(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Previous MONDAY.
LocalDate previousMonday = localDate.with(adjuster);
 
System.out.println("previousMonday: " + previousMonday);  // 2021-06-28
System.out.println("previousMonday.getDayOfWeek(): " + previousMonday.getDayOfWeek());  // MONDAY
Output:

localDate: 2021-07-05
localDate.getDayOfWeek(): MONDAY
previousMonday: 2021-06-28
previousMonday.getDayOfWeek(): MONDAY

16- previousOrSame(DayOfWeek)

Trả về một TemporalAdjuster - "ngày trong tuần (day-of-week) tương tự hoặc trước đó".

public static TemporalAdjuster previousOrSame(DayOfWeek dayOfWeek)
Ví dụ: Trả về ngày này nếu nó là thứ hai, ngược lại trả về ngày thứ hai trước đó.
TemporalAdjusters_previousOrSame_ex1.java

// Find the previous or same MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Previous or same MONDAY.
LocalDate previousOrSameMonday = localDate.with(adjuster);
 
System.out.println("previousOrSameMonday: " + previousOrSameMonday);  // 2021-07-05
System.out.println("previousOrSameMonday.getDayOfWeek(): " + previousOrSameMonday.getDayOfWeek());  // MONDAY

Xem thêm các chuyên mục: