日付がJavaで有効かどうかをチェックする方法

Javaで日付が有効かどうかを確認する方法

Javaでは、SimpleDateFormatクラスを使用して、指定された日付が有効かどうかを確認できます。

1. DateValidatorの例

package com.example.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateValidator {

    public boolean isThisDateValid(String dateToValidate, String dateFromat){

        if(dateToValidate == null){
            return false;
        }

        SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
        sdf.setLenient(false);

        try {

            //if not valid, it will throw ParseException
            Date date = sdf.parse(dateToValidate);
            System.out.println(date);

        } catch (ParseException e) {

            e.printStackTrace();
            return false;
        }

        return true;
    }

}

デフォルトでは、SimpleDateFormat.setLenient()はtrueに設定されています。日付の検証をより厳密にするには、常にオフにする必要があります。

2. 単体テスト

すべてのユニットテストケースに合格しました。

package com.example.test;

import org.junit.*;
import com.example.date.DateValidator;
import static org.junit.Assert.*;

public class DateValidatorTest {

    private DateValidator dateValidator;

    @Before
    public void init() {
        dateValidator = new DateValidator();
    }

    @Test
    public void testDateIsNull() {
        assertFalse(dateValidator.isThisDateValid(null, "dd/MM/yyyy"));
    }

    @Test
    public void testDayIsInvalid() {
        assertFalse(dateValidator.isThisDateValid("32/02/2012", "dd/MM/yyyy"));
    }

    @Test
    public void testMonthIsInvalid() {
        assertFalse(dateValidator.isThisDateValid("31/20/2012", "dd/MM/yyyy"));
    }

    @Test
    public void testYearIsInvalid() {
        assertFalse(dateValidator.isThisDateValid("31/20/19991", "dd/MM/yyyy"));
    }

    @Test
    public void testDateFormatIsInvalid() {
        assertFalse(dateValidator.isThisDateValid("2012/02/20", "dd/MM/yyyy"));
    }

    @Test
    public void testDateFeb29_2012() {
        assertTrue(dateValidator.isThisDateValid("29/02/2012", "dd/MM/yyyy"));
    }

    @Test
    public void testDateFeb29_2011() {
        assertFalse(dateValidator.isThisDateValid("29/02/2011", "dd/MM/yyyy"));
    }

    @Test
    public void testDateFeb28() {
        assertTrue(dateValidator.isThisDateValid("28/02/2011", "dd/MM/yyyy"));
    }

    @Test
    public void testDateIsValid_1() {
        assertTrue(dateValidator.isThisDateValid("31/01/2012", "dd/MM/yyyy"));
    }

    @Test
    public void testDateIsValid_2() {
        assertTrue(dateValidator.isThisDateValid("30/04/2012", "dd/MM/yyyy"));
    }

    @Test
    public void testDateIsValid_3() {
        assertTrue(dateValidator.isThisDateValid("31/05/2012", "dd/MM/yyyy"));
    }

}