Расчет дней между двумя датами в JAVA (поймать ошибку ParseException) - PullRequest
3 голосов
/ 09 марта 2020

Я пытаюсь подсчитать количество дней между двумя датами. Когда я запускаю это, он выдает catch (ParseException ex).

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

public class Main {

    public static void main(String[] args) {

        String date1 = "11/11/2020";
        String date2 = "13/11/2020";

        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");
            Date date_1 = dateFormat.parse(date1);
            Date date_2 = dateFormat.parse(date2);

            System.out.println(date_1);
            System.out.println(date_2);

            long numberOfDays = date_2.getTime() - date_1.getTime();
            numberOfDays = TimeUnit.DAYS.convert(numberOfDays, TimeUnit.MILLISECONDS);

            System.out.println(numberOfDays);

        } 
        catch (ParseException ex)
        {
            System.out.println("error");
        }
    }
}

, кроме catch, ошибок нет, поэтому я как бы потерялся.

Ответы [ 6 ]

4 голосов
/ 09 марта 2020

Не используйте дату. Попробуйте это.

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String date1 = "11/11/2020";
        String date2 = "13/11/2020";

        LocalDate d1 = LocalDate.parse(date1,dtf);
        LocalDate d2 = LocalDate.parse(date2,dtf);

        long ndays = d1.datesUntil(d2).count();
        System.out.println(ndays);
3 голосов
/ 09 марта 2020

Если вы распечатали перехваченное исключение:

System.out.println("error: " + ex.getLocalizedMessage());

Вы бы увидели:

error: Unparseable date: "11/11/2020"

Проблема в:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");

изменить его до:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

Поскольку предоставленные даты в этом формате.

2 голосов
/ 09 марта 2020

Если Java 8 - опция, я бы порекомендовал использовать Time API.

Пример:

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

public class Main
{
    public static void main(String[] args) {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String date1 = "11/11/2020";
        String date2 = "13/11/2020";

        LocalDate firstDate = LocalDate.parse(date1, format);
        LocalDate secondDate = LocalDate.parse(date2, format);

        long days = ChronoUnit.DAYS.between(firstDate, secondDate);
        System.out.println("Days between: " + days);
    }
}
2 голосов
/ 09 марта 2020

Просто измените это:

 SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");

на это:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

Дата, которую вы пытаетесь проанализировать 11/11/2020 не соответствует формату даты, который вы пытаетесь использовать dd-mm-yyyy

Вы можете решить подобные проблемы самостоятельно, распечатав трассировку стека внутри catch:

ex.printStackTrace();
1 голос
/ 09 марта 2020

Во-первых, у вас есть разные форматы ввода даты и определенный формат. Следовательно, вы получаете исключение при разборе.

Во-вторых, мы можем java.time.Duration класс в Java8 для такого вычисления. Пример:

public static void main(String[] args) throws ParseException {
    String date1 = "11/11/2020";
    String date2 = "13/11/2020";
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy");

    Duration duration = Duration.between(format.parse(date1).toInstant(), format.parse(date2).toInstant());
    System.out.println("Days between: " + duration.toDays());
}
1 голос
/ 09 марта 2020

Ваш шаблон неверен.

Вы используете:

new SimpleDateFormat("dd-mm-yyyy");

, но вам нужно использовать:

new SimpleDateFormat("dd/mm/yyyy");

потому что у вашей даты вместо "-" вместо "-" * "1013 *

...