Comment vérifier si la date est dans une certaine plage en Java?

Comment vérifier si la date est dans une certaine plage en Java?

Un exemple Java pour vérifier si une date fournie se situe dans une plage de 3 mois avant et après la date actuelle. L'idée est assez simple, utilisez simplement la classeCalendar pour reculer et avancer le mois pour créer une «plage de dates», et utilisez lesDate.before() etDate.after() pour vérifier si la date est comprise dans la gamme.

if (dateToValidate.before(currentDateAfter3Months.getTime())
        && dateToValidate.after(currentDateBefore3Months.getTime())) {

Voir l'exemple complet.

package com.example.date;

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

public class DateValidator {

    public boolean isThisDateWithin3MonthsRange(String dateToValidate,
            String dateFromat) {

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

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

            // current date after 3 months
            Calendar currentDateAfter3Months = Calendar.getInstance();
            currentDateAfter3Months.add(Calendar.MONTH, 3);

            // current date before 3 months
            Calendar currentDateBefore3Months = Calendar.getInstance();
            currentDateBefore3Months.add(Calendar.MONTH, -3);

            /*************** verbose ***********************/
            System.out.println("\n\ncurrentDate : "
                    + Calendar.getInstance().getTime());
            System.out.println("currentDateAfter3Months : "
                    + currentDateAfter3Months.getTime());
            System.out.println("currentDateBefore3Months : "
                    + currentDateBefore3Months.getTime());
            System.out.println("dateToValidate : " + dateToValidate);
            /************************************************/

            if (date.before(currentDateAfter3Months.getTime())
                    && date.after(currentDateBefore3Months.getTime())) {

                //ok everything is fine, date in range
                return true;

            } else {

                return false;

            }

        } catch (ParseException e) {

            e.printStackTrace();
            return false;
        }

    }

}

Un test unitaire simple pour prouver que le code ci-dessus fonctionne correctement, si vous exécutez un test unitaire inférieur, tous les cas seront passés.

package com.example.test;

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

public class DateValidatorRangeTest {

    private DateValidator dateValidator;

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

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

    @Test
    public void testDateWithinRange_2() {
        assertFalse(dateValidator.isThisDateWithin3MonthsRange("31/01/2011", "dd/MM/yyyy"));
    }

    @Test
    public void testDateWithinRange_3() {
        assertTrue(dateValidator.isThisDateWithin3MonthsRange("20/02/2012", "dd/MM/yyyy"));
    }

    @Test
    public void testDateWithinRange_4() {
        assertFalse(dateValidator.isThisDateWithin3MonthsRange("21/05/2012", "dd/MM/yyyy"));
    }

}

Tous les cas sont passés et sortis après des informations supplémentaires sur la console.

currentDate : Mon Feb 20 13:36:59 SGT 2012
currentDateAfter3Months : Sun May 20 13:36:59 SGT 2012
currentDateBefore3Months : Sun Nov 20 13:36:59 SGT 2011
dateToValidate : 31/01/2012


currentDate : Mon Feb 20 13:36:59 SGT 2012
currentDateAfter3Months : Sun May 20 13:36:59 SGT 2012
currentDateBefore3Months : Sun Nov 20 13:36:59 SGT 2011
dateToValidate : 31/01/2011


currentDate : Mon Feb 20 13:36:59 SGT 2012
currentDateAfter3Months : Sun May 20 13:36:59 SGT 2012
currentDateBefore3Months : Sun Nov 20 13:36:59 SGT 2011
dateToValidate : 20/02/2012


currentDate : Mon Feb 20 13:36:59 SGT 2012
currentDateAfter3Months : Sun May 20 13:36:59 SGT 2012
currentDateBefore3Months : Sun Nov 20 13:36:59 SGT 2011
dateToValidate : 21/05/2012