Kiểm tra một String có phải là ngày hợp lệ trong Java

Trong bài viết này, chúng ta sẽ cùng nhau tìm cách kiểm tra một String có phải là một ngày hợp lệ hay không thông qua các phương pháp mà chúng ta sẽ bàn luận ngay sau đây.

Trong hầu hết các ứng dụng, việc đầu tiên chúng ta cần làm khi nhận một dữ liệu là phải kiểm tra xem nó có hợp lệ hay không trước khi xử lý.

Trong trường hợp dữ liệu là một dạng Date, chúng ta cần chắc rằng:

  • String đầu vào phải có định dạng Date, ví dụ như MM/DD/YYYY.
  • Mỗi thành phần bên trong String phải hợp lệ, ví dụ như MM thì phải từ 1 đến 12.

Chúng ta có thể sử dụng regular expression để kiểm tra, tuy nhiên việc này sẽ rất phức khi chúng ta có rất nhiều định dạng Date cần kiểm tra, ngoài ra nó có thể ảnh hưởng đến hiệu suất của chương trình.

Do vậy, sau đây chúng ta sẽ bàn luận một số cách kiểm tra định dạng Date nhanh chóng, tiện lợi và linh hoạt.

Đầu tiên, hãy định nghĩa một interface sau:

public interface DateValidator {
   boolean isValid(String dateStr);
}

Kiểm tra định dạng Date – DateFormat

Ngay từ đầu Java đã cung cấp các phương thức giúp định dạng và phân tích dữ liệu Date. Chức năng này nằm trong abstract DateFormat và một triển khai của nó SimpleDateFormat.

Sau đây, chúng ta sẽ triển khai hàm kiểm tra định dạng Date trong Java sử dụng parse method của DateFormat.

public class DateValidatorUsingDateFormat implements DateValidator {
    private String dateFormat;

    public DateValidatorUsingDateFormat(String dateFormat) {
        this.dateFormat = dateFormat;
    }

    @Override
    public boolean isValid(String dateStr) {
        DateFormat sdf = new SimpleDateFormat(this.dateFormat);
        sdf.setLenient(false);
        try {
            sdf.parse(dateStr);
        } catch (ParseException e) {
            return false;
        }
        return true;
    }
}

Vì DateFormat không an toàn khi sử dụng trong môi trường đa luồng, chúng ta cần tạo một instance mới mỗi khi sử dụng.

DateValidator validator = new DateValidatorUsingDateFormat("MM/dd/yyyy");

assertTrue(validator.isValid("02/28/2019"));        
assertFalse(validator.isValid("02/30/2019"));

Kiểm tra định dạng Date – LocalDate

Java 8 đã giới thiệu một API Date và Time được cải tiến. Nó đã thêm class LocalDate, đại diện cho ngày không có thời gian. Lớp này là bất biến và an toàn theo luồng.

LocalDate cung cấp hai phương thức tĩnh để phân tích cú pháp của một dữ liệu Date. Cả hai đều sử dụng DateTimeFormatter để thực hiện phân tích cú pháp thực tế:

public class DateValidatorUsingLocalDate implements DateValidator {
    private DateTimeFormatter dateFormatter;
    
    public DateValidatorUsingLocalDate(DateTimeFormatter dateFormatter) {
        this.dateFormatter = dateFormatter;
    }

    @Override
    public boolean isValid(String dateStr) {
        try {
            LocalDate.parse(dateStr, this.dateFormatter);
        } catch (DateTimeParseException e) {
            return false;
        }
        return true;
    }
}

Việc triển khai sử dụng một đối tượng DateTimeFormatter để định dạng. Vì lớp này an toàn theo luồng.

DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE;
DateValidator validator = new DateValidatorUsingLocalDate(dateFormatter);
        
assertTrue(validator.isValid("20190228"));
assertFalse(validator.isValid("20190230"));

Kiểm tra định dạng Date -Apache Commons Validator

Project Apache Commons cung cấp một validation framework. Chứa các phương thức kiểm tra date, time, number, IP, email, url v.v

Đối với việc kiểm tra định dạng Date thì chúng ta có thể sử dụng GenericValidator class.

Nhưng trước hết, để sử dụng apache commons validator chúng ta cần thêm dependency vào pom.xml

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>1.6</version>
</dependency>

Và sau đó sử dụng GenericValidator để kiểm tra định dạng Date.

assertTrue(GenericValidator.isDate("2019-02-28", "yyyy-MM-dd", true));
assertFalse(GenericValidator.isDate("2019-02-29", "yyyy-MM-dd", true));

Nguồn

https://www.baeldung.com/java-string-valid-date

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