LocalDate thao tác nhanh với ngày tháng năm trong java

Khi mới bắt đầu học lập trình C/C++ khi thao tác với ngày-tháng-năm mình đã rất vất vã để triển khai các hàm như kiểm tra năm nhuận, tính khoảng cách giữa 2 ngày etc. Thật may là java đã cung cấp cho chúng ta LocalDate class hỗ trợ hầu hết các method thao tác ngày-tháng-năm giúp giảm thiểu thời gian code đáng kể.

LocalDate class là một immutable class đại diện cho ngày-tháng-năm không có múi giờ, ví dụ như 2020-01-03.

Khởi tạo LocalDate

Để khởi tạo LocalDate object chúng ta có thể sử dụng LocalDate.now() (Lấy giá trị ngày hiện tại trong hệ thống) hoặc LocalDate.of().

import java.time.LocalDate;
import java.time.Month;

class LocalDateExample {
    public static void main(String[] args) {

        // Current date
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate); // 2020-01-04

        //Specific date
        LocalDate localDate2 = LocalDate.of(2017, Month.MAY, 15);
        System.out.println(localDate2); // 2017-05-15
    }
}

Lấy ngày, tháng, năm từ LocalDate

Chúng ta có thể sử dụng getYear(), getMonth(), getDay() để lấy giá trị năm, tháng, ngày tương ứng trong LocalDate object.

import java.time.LocalDate;
class LocalDateExample {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.now();
        System.out.println("Year : " + localDate.getYear()); // Year : 2020
        System.out.println("Month : " + localDate.getMonth().getValue()); // Month : 1
        System.out.println("Day of Month : " + localDate.getDayOfMonth()); // Day of Month : 4
        System.out.println("Day of Week : " + localDate.getDayOfWeek()); // Day of Week : SATURDAY
        System.out.println("Day of Year : " + localDate.getDayOfYear()); // Day of Year : 4
    }
}

Cộng và trừ ngày, tháng, năm trong LocalDate

LocalDate có sẵn các method plus(), minus() tương ứng với ngày tháng năm để thực hiện thao tác cộng và trừ trong LocalDate object.

import java.time.LocalDate;
class LocalDateExample {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.now();

        // LocalDate's plus methods
        System.out.println("Addition of days : " + localDate.plusDays(5)); // Addition of days : 2020-01-09
        System.out.println("Addition of months : " + localDate.plusMonths(15)); // Addition of months : 2021-04-04
        System.out.println("Addition of weeks : " + localDate.plusWeeks(45)); // Addition of weeks : 2020-11-14
        System.out.println("Addition of years : " + localDate.plusYears(5)); // Addition of years : 2025-01-04

        // LocalDate's minus methods
        System.out.println("Subtraction of days : " + localDate.minusDays(5)); // Subtraction of days : 2019-12-30
        System.out.println("Subtraction of months : " + localDate.minusMonths(15)); // Subtraction of months : 2018-10-04
        System.out.println("Subtraction of weeks : " + localDate.minusWeeks(45)); // Subtraction of weeks : 2019-02-23
        System.out.println("Subtraction of years : " + localDate.minusYears(5)); // Subtraction of years : 2015-01-04

    }
}

So sánh LocalDate object trong java

Để so sánh LocalDate object trong java chúng ta có các method như isEqual() để so sánh bằng, isAfter(), isBefore(), compareTo().

isEqual(LocalDate other)

Trả về true nếu LocalDate object hiện tại bằng với other, ngược lại false.

// Example
LocalDate d1 = LocalDate.now();
LocalDate d2 = LocalDate.now();
LocalDate d3 = LocalDate.now().minusDays(1);

System.out.println(d1.isEqual(d2)); // true
System.out.println(d1.isEqual(d3)); // false

isAfter(LocalDate other)

isAfter() trả về true nếu LocalDate hiện tại có giá trị lớn hơn LocalDate other truyền vào, ngược lại false.

LocalDate d1 = LocalDate.now();
LocalDate d2 = LocalDate.now().plusDays(1);
LocalDate d3 = LocalDate.now().minusDays(1);

System.out.println(d1.isAfter(d2)); // false
System.out.println(d1.isAfter(d3)); // true
System.out.println(d1.isAfter(d1)); // false

isBefore(LocalDate other)

isBefore() trả về true nếu LocalDate hiện tại có giá trị nhỏ hơn LocalDate other truyền vào, ngược lại false.

LocalDate d1 = LocalDate.now();
LocalDate d2 = LocalDate.now().plusDays(1);
LocalDate d3 = LocalDate.now().minusDays(1);

System.out.println(d1.isBefore(d2)); // true
System.out.println(d1.isBefore(d3)); // false
System.out.println(d1.isBefore(d1)); // false

compareTo(LocalDate other)

So sánh LocalDate object hiện tại với other từ tham số truyền vào. Trả về  số dương nếu object hiện tại lớn hơn other, 0 nếu bằng nhau và âm nếu nhỏ hơn.

LocalDate d1 = LocalDate.now();
LocalDate d2 = LocalDate.now();
LocalDate d3 = LocalDate.now().minusDays(1);

System.out.println(d1.compareTo(d2)); // 0
System.out.println(d1.compareTo(d3)); // 1
System.out.println(d3.compareTo(d2)); // -1

Kiểm tra năm nhuận trong java

LocalDate cung cấp method isLeapYear() để kiểm tra năm nhuận trong java.

import java.time.LocalDate;
import java.time.Month;

class LocalDateExample {
    public static void main(String[] args) {

        LocalDate localDate1 = LocalDate.of(2017, Month.JANUARY, 1);
        LocalDate localDate2 = LocalDate.of(2016, Month.JANUARY, 1);

        if(localDate1.isLeapYear()){
            System.out.println(localDate1.getYear()+ " is a leap year");
        }else{
            System.out.println(localDate1.getYear()+ " is not a leap year");
        }

        if(localDate2.isLeapYear()){
            System.out.println(localDate2.getYear()+ " is a leap year");
        }else{
            System.out.println(localDate2.getYear()+ " is not a leap year");
        }

    }
}

Output:

2017 is not a leap year
2016 is a leap year

Convert String sang LocalDate trong java

Chúng ta có thể sử dụng methof parse() trong LocalDate class để convert một chuỗi sang LocalDate.

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class LocalDateExample {
    public static void main(String[] args) {

        // ISO Date
        LocalDate localDate = LocalDate.parse("2020-05-03",
                DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(localDate); // 2020-05-03

        // yyyy/MM/dd pattern
        LocalDate localDate1 = LocalDate.parse("2020/05/12",
                DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        System.out.println(localDate1); // 2020-05-12

        // MMM dd, yyyy pattern
        LocalDate localDate2 = LocalDate.parse("May 05, 2020",
                DateTimeFormatter.ofPattern("MMM dd, yyyy"));
        System.out.println(localDate2); // 2020-05-05

        // dd-MMM-yyyy pattern
        LocalDate localDate3 = LocalDate.parse("12-Jan-2020",
                DateTimeFormatter.ofPattern("dd-MMM-yyyy"));
        System.out.println(localDate3); // 2020-01-12

        // dd-LL-yyyy pattern
        LocalDate localDate4 = LocalDate.parse("12-01-2020",
                DateTimeFormatter.ofPattern("dd-LL-yyyy"));
        System.out.println(localDate4); // 2020-01-12

    }
}

Convert LocalDate sang String trong java

Chúng ta có thể sử dụng format() method trong LocalDate class để chuyển LocalDate object sang String.

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class LocalDateExample {
    public static void main(String[] args) {

        // ISO Date
        LocalDate localDate = LocalDate.now();
        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
        System.out.println(localDate.format(dateFormatter)); // 2020-01-04

        // yyyy/MM/dd pattern
        DateTimeFormatter dateFormatter1 = DateTimeFormatter
                .ofPattern("yyyy/MM/dd");
        System.out.println(localDate.format(dateFormatter1)); // 2020/01/04

        // MMMM dd, yyyy pattern
        DateTimeFormatter dateFormatter2 = DateTimeFormatter
                .ofPattern("MMMM dd, yyyy");
        System.out.println(localDate.format(dateFormatter2)); // January 04, 2020

        // dd-MMM-yyyy pattern
        DateTimeFormatter dateFormatter3 = DateTimeFormatter
                .ofPattern("dd-MMM-yyyy");
        System.out.println(localDate.format(dateFormatter3)); // 04-Jan-2020

        // dd-LL-yyyy pattern
        DateTimeFormatter dateFormatter4 = DateTimeFormatter
                .ofPattern("dd-LL-yyyy");
        System.out.println(localDate.format(dateFormatter4)); // 04-01-2020

    }
}

Kết

Với rất nhiều method hữu ích giúp chúng ta thao tác nhanh gọn hơn với ngày-tháng-năm, LocalDate được sử dụng rất nhiều trong các dự án java. Vậy nếu đã biết đến nó rồi thì đừng có dại mà đi implement một class Date nữa nhé, sẽ mất nhiều thời gian đó.

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x