openplanning

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

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- LocalDate

Lớp LocalDate đại diện cho ngày tháng địa phương (local date) trong hệ thống lịch ISO, nó không bao gồm thông tin thời gian và múi giờ. Một LocalDate có thể là ngày sinh, ngày nghỉ lễ chính thức,.. nó liên quan tới một ngày cụ thể của năm.
  • TODO Link?
Lớp LocalDate nằm trong package java.time. Cũng giống như các lớp khác được giới thiệu trong Java 8 Date Time API, LocalDate là bất biến (immutable) điều này có nghĩa là tất cả các tính toán trên LocalDate đều tạo ra một đối tượng LocalDate mới, vì vậy nó an toàn khi được sử dụng trong môi trường multithreading.

public final class LocalDate
        implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable

2- Static Factory methods

Lớp LocalDate không cung cấp bất kỳ một constructor nào, nhưng nó cung cấp các phương thức nhà máy tĩnh (static factory method) để tạo ra một đối tượng mới:

static LocalDate now()
static LocalDate now​(Clock clock)
static LocalDate now​(ZoneId zone)
static LocalDate of​(int year, int month, int dayOfMonth)
static LocalDate of​(int year, Month month, int dayOfMonth)
static LocalDate ofEpochDay​(long epochDay)
static LocalDate ofInstant​(Instant instant, ZoneId zone)
static LocalDate ofYearDay​(int year, int dayOfYear)
static LocalDate parse​(CharSequence text)
static LocalDate parse​(CharSequence text, DateTimeFormatter formatter)
Tạo đối tượng LocalDate đại diện cho ngày tháng hiện thời từ đồng hồ hệ thống và múi giờ mặc định (Trên máy tính của bạn).

// Ex: Current date from the system clock in the default time-zone.
LocalDate localDate = LocalDate.now();
System.out.println("localDate.now(): " + localDate); // 2021-06-17
Tạo đối tượng LocalDate đại diện cho ngày tháng hiện thời từ một đồng hồ được chỉ định:

Clock clock = Clock.systemDefaultZone();

LocalDate localDate = LocalDate.now(clock);
System.out.println("localDate.now(clock): " + localDate);
  • TODO Link?
Tạo đối tượng LocalDate đại diện cho ngày tháng hiện thời từ một ZoneId được chỉ định:

// Default system time-zone.
ZoneId zoneIdDefault = ZoneId.systemDefault();
        
// Ho Chi Minh City, Vietnam. UTC+7
ZoneId zoneId = ZoneId.of("Asia/Ho_Chi_Minh");

LocalDate localDate = LocalDate.now(zoneId);
System.out.println("localDate: " + localDate); // 2021-06-17
Tạo đối tượng LocalDate từ year, month, dayOfMonth được chỉ định:

// Ex: LocalDate based on year, month, dayOfMonth.
LocalDate localDate1 = LocalDate.of(2000, 5, 20); // 2000-05-20
System.out.println("localDate1: " + localDate1);

LocalDate localDate2 = LocalDate.of(2000, Month.MAY, 20); // 2000-05-20
System.out.println("localDate2: " + localDate2);
Tạo đối tượng LocalDate từ year, dayOfYear được chỉ định:

// Ex: LocalDate based on year and dayOfYear
LocalDate localDate1 = LocalDate.ofYearDay(1995, 1); // 1995-01-01 + 0 days.
System.out.println("localDate1: " + localDate1); // 1995-01-01

LocalDate localDate2 = LocalDate.ofYearDay(1995, 51); // 1995-01-01 + 50 days.
System.out.println("localDate2: " + localDate2); // 1995-02-20
Tạo đối tượng LocalDate từ epochDay được chỉ định:

// Ex: LocalDate based on epochDay.
LocalDate localDate1 = LocalDate.ofEpochDay(0); // 1971-01-01 + 0 days.
System.out.println("localDate1: " + localDate1); // 1970-01-01

LocalDate localDate2 = LocalDate.ofEpochDay(1000); // 1971-01-01 + 1000 days.
System.out.println("localDate2: " + localDate2); // 1972-09-27
Tạo đối tượng LocalDate từ các đối tượng InstantZoneId:

Instant instant = Instant.now();
ZoneId zoneId = ZoneId.systemDefault();

// LocalDate based on Instant and ZoneId.
LocalDate localDate = LocalDate.ofInstant(instant, zoneId);
System.out.println("localDate: " + localDate);
Tạo đối tượng LocalDate từ việc phân tích một chuỗi văn bản có định dạng ngày tháng:

// Ex: LocalDate based on CharSequence.
LocalDate localDate1 = LocalDate.parse("2011-11-20");
System.out.println("localDate1: " + localDate1); // 2011-11-20

// Ex: LocalDate based on CharSequence and DateTimeFormatter
DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("dd/MM/yyyy");

LocalDate localDate2 = LocalDate.parse("20/11/2020", fmt2);
System.out.println("localDate2: " + localDate2); // 2011-11-20
  • TODO Link?

3- format(DateTimeFormatter)

Định dạng đối tượng LocalDate này bằng một đối tượng DateTimeFormatter được chỉ định.

// Inherited from ChronoLocalDate interface
public String format(DateTimeFormatter formatter)
Ví dụ:
LocalDate_format_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

DateTimeFormatter fmt1 = DateTimeFormatter.BASIC_ISO_DATE; // yyyyMMdd  
System.out.println("BASIC_ISO_DATE: " + localDate.format(fmt1)); // 20200515

DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("dd/MM/yyyy");  
System.out.println("dd/MM/yyyy: " + localDate.format(fmt2)); // 15/05/2020
  • TODO Link?
  • TODO Link?

4- isBefore(..), isAfter(..)

Phương thức isBefore(ChronoLocalDate) được sử dụng để kiểm tra đối tượng LocalDate này có đứng trước (before) một đối tượng được chỉ định khác trên dòng thời gian hay không.

// Inherited from ChronoLocalDate interface
public boolean isBefore(ChronoLocalDate other)
Phương thức isAfter(ChronoLocalDate) được sử dụng để kiểm tra đối tượng LocalDate này có đứng sau (after) một đối tượng được chỉ định khác trên dòng thời gian hay không.

// Inherited from ChronoLocalDate interface
public boolean isAfter(ChronoLocalDate other)
localDate1 is before localDate2.

LocalDate localDate1 = LocalDate.parse("1990-05-15"); // 1990-May-15
LocalDate localDate2 = LocalDate.parse("2020-12-15"); // 2020-Dec-15


System.out.println("localDate1: " + localDate1); // 1990-05-15
System.out.println("localDate2: " + localDate2); // 2020-12-15
System.out.println();

System.out.println("localDate1.isBefore(localDate2): " + localDate1.isBefore(localDate2)); // true
System.out.println("localDate1.isAfter(localDate2): " + localDate1.isAfter(localDate2)); // false 
Output:

localDate1: 1990-05-15
localDate2: 2020-12-15

localDate1.isBefore(localDate2): true
localDate1.isAfter(localDate2): false
  • TODO Link?

5- lengthOfMonth(), lengthOfYear()

Phương thức lengthOfMonth() trả về số ngày của tháng đang được biểu thị bởi đối tượng LocalDate này.
Phương thức lengthOfYear() trả về số ngày của năm đang được biểu thị bởi đối tượng LocalDate này.

public int lengthOfMonth()  

public int lengthOfYear()
Ví dụ:
LocalDate_lengthX_ex1.java

package org.o7planning.localdate.ex;

import java.time.LocalDate;

public class LocalDate_lengthX_ex1 {

    public static void main(String[] args) {
        LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
        System.out.println("localDate: " + localDate); // 2020-05-15
        System.out.println();
        
        System.out.println("localDate.lengthOfMonth(): " + localDate.lengthOfMonth());  // 31 days
        System.out.println("localDate.lengthOfYear(): " + localDate.lengthOfYear()); // 366 days
    }
}

6- getX() *

Phương thức getYear() trả về năm được biểu thị bởi LocalDate này, nó tương đương với việc gọi phương thức get(ChronoField.YEAR), nếu muốn lấy năm trong kỷ nguyên (year of era) hãy gọi phương thức get(ChronoField.YEAR_OF_ERA).

public int getYear()  
public int getMonthValue()   
public Month getMonth()
public int getDayOfMonth()
public int getDayOfYear()
public DayOfWeek getDayOfWeek()  
public IsoEra getEra()  
public IsoChronology getChronology()  
Các phương thức khác như getMonthValue(), getMonth(), getDayOfMonth(), getDayOfYear(), getDayOfWeek(),... cũng được hiểu như cái tên của nó.
Method Same As
getYear() localDate.get(ChronoField.YEAR)
getMonthValue() localDate.get(ChronoField.MONTH_OF_YEAR)
getMonth() Month.of(localDate.get(ChronoField.MONTH_OF_YEAR))
getDayOfMonth() localDate.get(ChronoField.DAY_OF_MONTH)
getDayOfYear() localDate.get(ChronoField.DAY_OF_YEAR)
getDayOfWeek()  DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))
getEra()  localDate.get(ChronoField.ERA)
getChronology()  localDate.get(ChronoField.CHRONOLOGY)
Ví dụ:
LocalDate_getX_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

System.out.println("localDate.getEra(): " + localDate.getEra());  // IsoEra.CE  (enum)
System.out.println("localDate.getDayOfYear(): " + localDate.getDayOfYear()); // 136
System.out.println("localDate.getDayOfMonth(): " + localDate.getDayOfMonth()); // 15
System.out.println("localDate.getYear(): " + localDate.getYear());  // 2020
System.out.println("localDate.getMonth(): " + localDate.getMonth());  // Month.MAY (enum)
System.out.println("localDate.getMonthValue(): " + localDate.getMonthValue()); // 5
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek()); // DayOfWeek.FRIDAY (enum)
Output:

localDate: 2020-05-15

localDate.getEra(): CE
localDate.getDayOfYear(): 136
localDate.getDayOfMonth(): 15
localDate.getYear(): 2020
localDate.getMonth(): MAY
localDate.getMonthValue(): 5
localDate.getDayOfWeek(): FRIDAY

7- get(TemporalField)

Trả về giá trị của trường (field) đã chỉ định của đối tượng LocalDate này dưới dạng một số nguyên 32 bit.

// Inherited from TemporalAccessor interface
public int get(TemporalField field)
Chú ý: Một số trường (field) có thể không được hỗ trợ bởi LocalDateUnsupportedTemporalTypeException sẽ được ném ra. Để chắc chắn, hãy sử dụng phương thức isSupported(TemporalField) để kiểm tra xem một trường nào đó có được LocalDate hỗ trợ hay không.
Ví dụ:
LocalDate_get_field_ex1.java

LocalDate date = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + date); // 2020-05-15
System.out.println();

// int get(TemporalField field)
System.out.println("DAY_OF_MONTH: " + date.get(ChronoField.DAY_OF_MONTH)); // 15
System.out.println("DAY_OF_WEEK: " + date.get(ChronoField.DAY_OF_WEEK)); // 5
System.out.println("DAY_OF_YEAR: " + date.get(ChronoField.DAY_OF_YEAR)); // 136
System.out.println("ERA: " + date.get(ChronoField.ERA)); // 1
System.out.println("YEAR: " + date.get(ChronoField.YEAR)); // 2020
System.out.println("YEAR_OF_ERA: " + date.get(ChronoField.YEAR_OF_ERA)); // 2020
System.out.println("ALIGNED_DAY_OF_WEEK_IN_MONTH: " + date.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH)); // 1
System.out.println("ALIGNED_DAY_OF_WEEK_IN_YEAR: " + date.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR)); // 3
System.out.println("ALIGNED_WEEK_OF_MONTH: " + date.get(ChronoField.ALIGNED_WEEK_OF_MONTH)); // 3
System.out.println("ALIGNED_WEEK_OF_YEAR: " + date.get(ChronoField.ALIGNED_WEEK_OF_YEAR)); // 20

// Use getLong() instead
// System.out.println("PROLEPTIC_MONTH: " + date.get(ChronoField.PROLEPTIC_MONTH)); // 24244
// System.out.println("EPOCH_DAY: " + date.get(ChronoField.EPOCH_DAY)); // 18397

8- getLong(TemporalField)

Trả về giá trị của trường (field) đã chỉ định của đối tượng LocalDate này dưới dạng một số nguyên 64 bit.

// Inherited from TemporalAccessor interface
public long getLong(TemporalField field)
Chú ý: Một số trường (field) có thể không được hỗ trợ bởi LocalDateUnsupportedTemporalTypeException sẽ được ném ra. Để chắc chắn, hãy sử dụng phương thức isSupported(TemporalField) để kiểm tra xem một trường nào đó có được LocalDate hỗ trợ hay không.
Ví dụ:
LocalDate_getLong_field_ex1.java

LocalDate date = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + date); // 2020-05-15
System.out.println();

// long getLong(TemporalField field)
System.out.println("DAY_OF_MONTH: " + date.getLong(ChronoField.DAY_OF_MONTH)); // 15
System.out.println("DAY_OF_WEEK: " + date.getLong(ChronoField.DAY_OF_WEEK)); // 5
System.out.println("DAY_OF_YEAR: " + date.getLong(ChronoField.DAY_OF_YEAR)); // 136
System.out.println("ERA: " + date.getLong(ChronoField.ERA)); // 1
System.out.println("YEAR: " + date.getLong(ChronoField.YEAR)); // 2020
System.out.println("YEAR_OF_ERA: " + date.getLong(ChronoField.YEAR_OF_ERA)); // 2020
System.out.println("ALIGNED_DAY_OF_WEEK_IN_MONTH: " + date.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH)); // 1
System.out.println("ALIGNED_DAY_OF_WEEK_IN_YEAR: " + date.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR)); // 3
System.out.println("ALIGNED_WEEK_OF_MONTH: " + date.getLong(ChronoField.ALIGNED_WEEK_OF_MONTH)); // 3
System.out.println("ALIGNED_WEEK_OF_YEAR: " + date.getLong(ChronoField.ALIGNED_WEEK_OF_YEAR)); // 20

System.out.println("PROLEPTIC_MONTH: " + date.getLong(ChronoField.PROLEPTIC_MONTH)); // 24244
System.out.println("EPOCH_DAY: " + date.getLong(ChronoField.EPOCH_DAY)); // 18397

9- plusX(..) *

Phương thức plusYear(yearsToAdd) trả về một bản sao của đối tượng LocalDate này với một lượng năm chỉ định được thêm vào.
Các phương thức plusMonths(monthsToAdd), plusWeeks(weeksToAdd), plusDays(daysToAdd) cũng được hiểu tương tự giống như cái tên của nó.

public LocalDate plusYears(long yearsToAdd)  
public LocalDate plusMonths(long monthsToAdd)  
public LocalDate plusWeeks(long weeksToAdd)
public LocalDate plusDays(long daysToAdd)  
Ví dụ:
LocalDate_plusX_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

// plusDays(long daysToAdd)
LocalDate localDate1 = localDate.plusDays(10);
System.out.println("localDate1: " + localDate1); // 2020-05-25

LocalDate localDate2 = localDate.plusDays(-15);
System.out.println("localDate2: " + localDate2); // 2020-04-30

// plusMonths(long monthsToAdd)
LocalDate localDate3 = localDate.plusMonths(3);
System.out.println("localDate3: " + localDate3); // 2020-08-15

// plusYears(long yearsToAdd)
LocalDate localDate4 = localDate.plusYears(1);
System.out.println("localDate4: " + localDate4); // 2021-05-15

// plusWeeks(long weeksToAdd)
LocalDate localDate5 = localDate.plusWeeks(2);
System.out.println("localDate5: " + localDate5); // 2020-05-29
Output:

localDate: 2020-05-15

localDate1: 2020-05-25
localDate2: 2020-04-30
localDate3: 2020-08-15
localDate4: 2021-05-15
localDate5: 2020-05-29

10- plus(TemporalAmount)

Trả về một bản sao của đối tượng LocalDate này với một lượng thời gian được thêm vào.

// Inherited from Temporal interface
public LocalDate plus(TemporalAmount amountToAdd)  
Ví dụ:
LocalDate_plus_amount_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

// plus(TemporalAmount amountToAdd)
TemporalAmount amount1 = Period.ofDays(5);
LocalDate localDate1 = localDate.plus(amount1);
System.out.println("localDate1: " + localDate1); // 2020-05-20

// plus(TemporalAmount amountToAdd)
LocalDate from = LocalDate.of(2020, 5, 10);
LocalDate to = LocalDate.of(2020, 5, 12);

TemporalAmount amount2 = Period.between(from, to); // 2 days
LocalDate localDate2 = localDate.plus(amount2);
System.out.println("localDate2: " + localDate2
Output:

localDate: 2020-05-15

localDate1: 2020-05-20
localDate2: 2020-05-17

11- plus(long, TemporalUnit)

Trả về một bản sao của đối tượng LocalDate này với một giá trị chỉ định được thêm vào theo đơn vị tính đã cho.

// Inherited from Temporal interface
public LocalDate plus(long amountToAdd, TemporalUnit unit)
Ví dụ:
LocalDate_plus_unit_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

// plus(long amountToAdd, TemporalUnit unit)
LocalDate localDate1 = localDate.plus(5, ChronoUnit.DAYS);
System.out.println("localDate1: " + localDate1); // 2020-05-20

// plus(long amountToAdd, TemporalUnit unit)
LocalDate localDate2 = localDate.plus(10, ChronoUnit.MONTHS);
System.out.println("localDate2: " + localDate2); // 2021-03-15
Output:

localDate: 2020-05-15

localDate1: 2020-05-20
localDate2: 2021-03-15

12- minusX(..) *

Phương thức minusYears(yearsToSubtract) trả về một bản sao của đối tượng LocalDate này với một lượng năm chỉ định được trừ đi.
Các phương thức minusMonths(monthsToSubtract), minusWeeks(weeksToSubtract), minusDays(daysToSubtract) cũng được hiểu tương tự giống như cái tên của nó.

public LocalDate minusYears(long yearsToSubtract)  
public LocalDate minusMonths(long monthsToSubtract)  
public LocalDate minusWeeks(long weeksToSubtract)  
public LocalDate minusDays(long daysToSubtract)  
Ví dụ:

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

// minusDays(long daysToSubtract)
LocalDate localDate1 = localDate.minusDays(10);
System.out.println("localDate1: " + localDate1); // 2020-05-05

LocalDate localDate2 = localDate.minusDays(-10);
System.out.println("localDate2: " + localDate2); // 2020-05-25

// minusMonths(long monthsToSubtract)
LocalDate localDate3 = localDate.minusMonths(3);
System.out.println("localDate3: " + localDate3); // 2020-02-15

// minusYears(long yearsToSubtract)
LocalDate localDate4 = localDate.minusYears(1);
System.out.println("localDate4: " + localDate4); // 2019-05-15

// minusWeeks(long weeksToSubtract)
LocalDate localDate5 = localDate.minusWeeks(2);
System.out.println("localDate5: " + localDate5); // 2020-05-01

// minus(TemporalAmount)
TemporalAmount amount6 = Period.ofDays(5);
LocalDate localDate6 = localDate.minus(amount6);
System.out.println("localDate6: " + localDate6); // 2020-05-10

// minus(TemporalAmount)
LocalDate from = LocalDate.of(2020, 5, 10);
LocalDate to = LocalDate.of(2020, 5, 12);

TemporalAmount amount7 = Period.between(from, to); // 2 days
LocalDate localDate7 = localDate.minus(amount7);
System.out.println("localDate7: " + localDate7); // 2020-05-13

// minus(long amountToSubtract, TemporalUnit unit)
TemporalUnit unit = ChronoUnit.DAYS;
LocalDate localDate8 = localDate.minus(3, unit);

System.out.println("localDate8: " + localDate8); // 2020-05-12
Output:

localDate: 2020-05-15

localDate1: 2020-05-05
localDate2: 2020-05-25
localDate3: 2020-02-15
localDate4: 2019-05-15
localDate5: 2020-05-01
localDate6: 2020-05-10
localDate7: 2020-05-13
localDate8: 2020-05-12

13- minus(TemporalAmount)

Trả về một bản sao của đối tượng LocalDate này với một lượng thời gian được trừ đi.

// Inherited from Temporal interface.
public LocalDate minus(TemporalAmount amountToSubtract)  
Ví dụ:
LocalDate_minus_amount_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

// minus(TemporalAmount amountToSubtract)
TemporalAmount amount1 = Period.ofDays(5);
LocalDate localDate1 = localDate.minus(amount1);
System.out.println("localDate1: " + localDate1); // 2020-05-10

// minus(TemporalAmount amountToSubtract)
LocalDate from = LocalDate.of(2020, 5, 10);
LocalDate to = LocalDate.of(2020, 5, 12);

TemporalAmount amount2 = Period.between(from, to); // 2 days
LocalDate localDate2 = localDate.minus(amount2);
System.out.println("localDate2: " + localDate2); // 2020-05-13

14- minus(long, TemporalUnit)

Trả về một bản sao của đối tượng LocalDate này với một giá trị chỉ định được trừ đi theo đơn vị tính đã cho.

// Inherited from Temporal interface.
public LocalDate minus(long amountToSubtract, TemporalUnit unit)
Ví dụ:
LocalDate_minus_unit_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15
System.out.println("localDate: " + localDate); // 2020-05-15
System.out.println();

// minus(long amountToSubtract, TemporalUnit unit)
LocalDate localDate1 = localDate.minus(5, ChronoUnit.DAYS);
System.out.println("localDate1: " + localDate1); // 2020-05-10

// minus(long amountToSubtract, TemporalUnit unit)
LocalDate localDate2 = localDate.minus(10, ChronoUnit.MONTHS);
System.out.println("localDate2: " + localDate2); // 2019-07-15

15- withX(..) *


public LocalDate withYear(int year)  

public LocalDate withMonth(int month)  

public LocalDate withDayOfMonth(int dayOfMonth)

public LocalDate withDayOfYear(int dayOfYear)
Phương thức withYear(year) trả về một bản sao của đối tượng LocalDate này với năm đã được thay đổi. Nếu ngày trong tháng không hợp lệ trong năm, ngày đó sẽ được thay đổi thành ngày hợp lệ cuối cùng trong tháng.
LocalDate_withYear_ex1.java

LocalDate localDate1 = LocalDate.parse("2020-02-29").withYear(2024);  
System.out.println("localDate1: " + localDate1); // 2024-02-29

LocalDate localDate2 = LocalDate.parse("2020-02-29").withYear(2019); // Important Note!
System.out.println("localDate2: " + localDate2); // 2019-02-28

LocalDate localDate3 = LocalDate.parse("2020-02-28").withYear(2019);  
System.out.println("localDate3: " + localDate3); // 2019-02-28

LocalDate localDate4 = LocalDate.parse("2020-02-21").withYear(2019);  
System.out.println("localDate4: " + localDate4); // 2019-02-21
Phương thức withMonth(month) trả về một bản sao của đối tượng LocalDate này với tháng đã được thay đổi. Nếu ngày trong tháng không hợp lệ trong năm, ngày đó sẽ được thay đổi thành ngày hợp lệ cuối cùng trong tháng.
LocalDate_withMonth_ex1.java

LocalDate localDate1 = LocalDate.parse("2020-03-31").withMonth(2); // Important Note!
System.out.println("localDate1: " + localDate1); // 2020-02-29

LocalDate localDate2 = LocalDate.parse("2020-03-31").withMonth(2); // Important Note!
System.out.println("localDate2: " + localDate2); // 2020-02-29

LocalDate localDate3 = LocalDate.parse("2020-03-29").withMonth(2);  
System.out.println("localDate3: " + localDate3); // 2019-02-28

LocalDate localDate4 = LocalDate.parse("2020-03-21").withMonth(2);  
System.out.println("localDate4: " + localDate4); // 2020-02-21
Phương thức withDayOfMonth(dayOfMonth) trả về một bản sao của đối tượng LocalDate này với ngày trong tháng (day-of-month) đã được thay đổi. Nếu ngày trong tháng không hợp lệ thì DateTimeException sẽ được ném ra.
LocalDate_withDayOfMonth_ex1.java

LocalDate localDate1 = LocalDate.parse("2020-02-01").withDayOfMonth(15);  
System.out.println("localDate1: " + localDate1); // 2020-02-15

LocalDate localDate2 = LocalDate.parse("2020-02-01").withDayOfMonth(29);  
System.out.println("localDate2: " + localDate2); // 2020-02-29

// Invalid date.
// Throws java.time.DateTimeException: Invalid date 'FEBRUARY 30'
LocalDate localDate3 = LocalDate.parse("2020-02-01").withDayOfMonth(30);  
System.out.println("localDate3: " + localDate3);
Output:

localDate1: 2020-02-15
localDate2: 2020-02-29
Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 30'
    at java.base/java.time.LocalDate.create(LocalDate.java:459)
    at java.base/java.time.LocalDate.of(LocalDate.java:271)
    at java.base/java.time.LocalDate.withDayOfMonth(LocalDate.java:1124)
    at org.o7planning.localdate.ex.LocalDate_withDayOfMonth_ex1.main(LocalDate_withDayOfMonth_ex1.java:17)
Phương thức withDayOfYear(dayOfYear) trả về một bản sao của đối tượng LocalDate này với ngày trong năm (day-of-year) đã được thay đổi. Nếu dayOfYear không hợp lệ thì DateTimeException sẽ được ném ra, giá trị hợp lệ từ 1 đến 365 (Hoặc 366).
LocalDate_withDayOfYear_ex1.java

LocalDate localDate1 = LocalDate.parse("2020-02-01").withDayOfYear(15);  
System.out.println("localDate1: " + localDate1); // 2020-01-15

LocalDate localDate2 = LocalDate.parse("2020-02-01").withDayOfYear(29);  
System.out.println("localDate2: " + localDate2); // 2020-01-29

LocalDate localDate3 = LocalDate.parse("2020-02-01").withDayOfYear(35);  
System.out.println("localDate3: " + localDate3); // 2020-02-04

16- with(TemporalAdjuster)

Trả về bản sao của đối tượng LocalDate này, với dữ liệu ngày tháng được điều chỉnh bởi đối tượng TemporalAdjuster.

// Inherited from Temporal interface
public LocalDate with(TemporalAdjuster adjuster)  
Ví dụ:
LocalDate_with_adjuster_ex1.java

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

LocalDate firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("firstDayOfMonth: " + firstDayOfMonth);

LocalDate nextMonday = now.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("nextMonday: " + nextMonday);

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

Now is: 2021-06-01

firstDayOfMonth: 2021-06-01
nextMonday: 2021-06-07
firstDayOfNextYear: 2022-01-01
Ví dụ: Viết một TemporalAdjuster tuỳ biến để tìm kiếm ngày giáng sinh tiếp theo.
LocalDate_with_adjuster_ex2.java

package org.o7planning.localdate.ex;

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;

public class LocalDate_with_adjuster_ex2 {

    public static void main(String[] args) {
        LocalDate localDate = LocalDate.parse("2020-12-28");
        System.out.println("Date : " + localDate);

        // with(TemporalAdjuster):
        LocalDate localDate2 = localDate.with(new NextChristmas());
        System.out.println("Next Christmas : " + localDate2);
    }
}

class NextChristmas implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {
        int month = temporal.get(ChronoField.MONTH_OF_YEAR);
        int day = temporal.get(ChronoField.DAY_OF_MONTH);
        if(month == 12 && day > 25)  {
            temporal = temporal.plus(Period.ofYears(1));
        }
        return temporal.with(ChronoField.MONTH_OF_YEAR, 12).with(ChronoField.DAY_OF_MONTH, 25);
    }
}
Output:

Date : 2020-12-28
Next Christmas : 2021-12-25

17- with(TemporalField, long)

Trả về bản sao của đối tượng LocalDate này với trường (field) chỉ định được thay đổi sang giá trị mới.

// Inherited from Temporal interface
public LocalDate with(TemporalField field, long newValue)
Trong một số trường hợp, việc thay đổi trường (field) được chỉ định có thể khiến ngày kết quả trở nên không hợp lệ, chẳng hạn như việc thay đổi tháng từ ngày 31 tháng 1 sang tháng 2 sẽ làm cho ngày trong tháng không hợp lệ. Trong những trường hợp như thế này, vấn đề đã được phương thức này xử lý. Thông thường, nó sẽ chọn ngày hợp lệ trước đó, sẽ là ngày hợp lệ cuối cùng của tháng 2 trong ví dụ này.
Ví dụ:
LocalDate_with_field_ex1.java

LocalDate myDate = LocalDate.parse("2021-05-29");

System.out.println("myDate is: " + myDate);
System.out.println("myDate day of week: " + myDate.get(ChronoField.DAY_OF_WEEK));  // 6
System.out.println("myDate day of month: " + myDate.get(ChronoField.DAY_OF_MONTH)); // 29
System.out.println();

LocalDate localDate1 =    myDate.with(ChronoField.DAY_OF_WEEK, 3);   
System.out.println("localDate1: " + localDate1); // 2021-05-26

LocalDate localDate2 =    myDate.with(ChronoField.DAY_OF_MONTH, 10);  
System.out.println("localDate2: " + localDate2);  // 2021-05-10

// February 2021 has only 28 days.
LocalDate localDate3 =    myDate.with(ChronoField.MONTH_OF_YEAR, 2);  
System.out.println("localDate3: " + localDate3);  // 2021-02-28  (***)
Output:

myDate is: 2021-05-29
myDate day of week: 6
myDate day of month: 29

localDate1: 2021-05-26
localDate2: 2021-05-10
localDate3: 2021-02-28

18- range(TemporalField)

Trả về phạm vi các giá trị hợp lệ cho trường (field) được chỉ định.

//  Inherited from TemporalAccessor interface
public ValueRange range(TemporalField field)
Ví dụ:
LocalDate_range_ex1.java

LocalDate localDate   = LocalDate.parse("2021-06-18");  
System.out.println("LocalDate: "  + localDate);
 
// range(TemporalField field)
ValueRange range = localDate.range(ChronoField.DAY_OF_MONTH);
 
// Print range of DAY_OF_MONTH
System.out.println("Range of DAY_OF_MONTH: "  + range); // 1 - 30

System.out.println("First day of this month: " + range.getMinimum()); // 1
System.out.println("Last day of this month: " + range.getMaximum()); // 30

ValueRange range2 = localDate.range(ChronoField.DAY_OF_YEAR);
System.out.println("Range of DAY_OF_YEAR: "  + range2); // 1 - 365

19- query(TemporalQuery<R>)

Truy vấn đối tượng LocalDate này với tham số TemporalQuery đã cho để trích ra thông tin.

// Inherited from TemporalAccessor interface
public <R> R query(TemporalQuery<R> query)
Ví dụ:
LocalDate_query_ex1.java

package org.o7planning.localdate.ex;

import java.time.LocalDate;
import java.time.temporal.TemporalQueries;

public class LocalDate_query_ex1 {

    public static void main(String[] args) {
        LocalDate localDate = LocalDate.parse("2021-05-15");

        // Apply query method of LocalDate class
        String value = localDate.query(TemporalQueries.precision()).toString();

        // Print the result
        System.out.println("Precision value for LocalDate is " + value);

        // Apply query method of LocalDate class
        System.out.println("Zone value for LocalDate is " + localDate.query(TemporalQueries.offset()));
    }
}
Output:

Precision value for LocalDate is Days
Zone value for LocalDate is null

20- isLeapYear()

Kiểm tra xem năm đang được biểu thị trong đối tượng LocalDate này có phải là một năm nhuận hay không.

// Inherited from ChronoLocalDate interface
public boolean isLeapYear()  
Về cơ bản, trong hệ thống lịch ISO, một năm được coi là năm nhuận nếu nó chia hết cho 4, tuy nhiên năm chia hết cho 100 không phải là năm nhuận ngoại trừ trường hợp nó chia hết cho 400.
Như vậy:
  • Năm 1904 là năm nhuận vì nó chia hết cho 4 và không chia hết cho 100.
  • Năm 1900 không phải là năm nhuận vì nó chia hết cho 100 nhưng không chia hết cho 400.
  • Năm 2000 là năm nhuận vì nó chia hết cho 400.

21- isSupported(TemporalField)

Kiểm tra xem một TemporalField đã cho có được hỗ trợ hay không.

// Inherited from TemporalAccessor interface
public boolean isSupported(TemporalField field)
Về cơ bản, LocalDate hỗ trợ các TemporalField sau:
  • ChronoField.DAY_OF_WEEK
  • ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH
  • ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR
  • ChronoField.DAY_OF_MONTH
  • ChronoField.DAY_OF_YEAR
  • ChronoField.EPOCH_DAY
  • ChronoField.ALIGNED_WEEK_OF_MONTH
  • ChronoField.ALIGNED_WEEK_OF_YEAR
  • ChronoField.MONTH_OF_YEAR
  • ChronoField.PROLEPTIC_MONTH
  • ChronoField.YEAR_OF_ERA
  • ChronoField.YEAR
  • ChronoField.ERA
Ví dụ:
LocalDate_isSupported_ex1.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15

// boolean isSupported(TemporalField field)
// LocalDate does not support ChronoField.MINUTE_OF_DAY, HOUR_OF_DAY,.. (** Used for LocalDateTime, LocalTime)
System.out.println("MINUTE_OF_DAY is supported? " + localDate.isSupported(ChronoField.MINUTE_OF_DAY)); // false
System.out.println("HOUR_OF_DAY is supported? " + localDate.isSupported(ChronoField.HOUR_OF_DAY)); // false

// LocalDate support ChronoField.MONTH_OF_YEAR, DAY_OF_WEEK,..
System.out.println("MONTH_OF_YEAR is supported? " + localDate.isSupported(ChronoField.MONTH_OF_YEAR)); // true
System.out.println("DAY_OF_WEEK is supported? " + localDate.isSupported(ChronoField.DAY_OF_WEEK)); // true

22- isSupported(TemporalUnit)

Kiểm tra xem một TemporalUnit đã chỉ định có được hỗ trợ hay không.

// Inherited from Temporal interface
public boolean isSupported(TemporalUnit unit)
Về cơ bản, LocalDate hỗ trợ các TemporalUnit sau:
  • ChronoUnit.DAYS
  • ChronoUnit.WEEKS
  • ChronoUnit.MONTHS
  • ChronoUnit.YEARS
  • ChronoUnit.DECADES
  • ChronoUnit.CENTURIES
  • ChronoUnit.MILLENNIA
  • ChronoUnit.ERAS
Ví dụ:
LocalDate_isSupported_ex2.java

LocalDate localDate = LocalDate.parse("2020-05-15"); // 2020-May-15

// boolean isSupported(TemporalUnit unit)
// LocalDate does not support ChronoUnit.HOURS, MINUTES,.. (** Used for LocalDateTime, LocalTime)
System.out.println("HOURS is supported? " + localDate.isSupported(ChronoUnit.HOURS)); // false
System.out.println("MINUTES is supported? " + localDate.isSupported(ChronoUnit.MINUTES)); // false

// LocalDate support ChronoUnit.CENTURIES, WEEKS,..
System.out.println("CENTURIES is supported? " + localDate.isSupported(ChronoUnit.CENTURIES)); // true
System.out.println("WEEKS is supported? " + localDate.isSupported(ChronoUnit.WEEKS)); // true

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