Различие в днях между двумя датами в Java?

Я должен найти количество дней между двумя датами: каждый из отчета, и каждый - текущая дата. Мой отрывок:

  int age=calculateDifference(agingDate, today);

Здесь calculateDifference закрытый метод, agingDate и today Date объекты, только для Вашего разъяснения. Я следовал двум статьям от форума Java, Поток 1 / Поток 2.

Это хорошо работает в автономной программе, хотя, когда я включаю это в свою логику для чтения из отчета, я получаю необычное различие в значениях.

Почему это происходит и как я могу зафиксировать его?

РЕДАКТИРОВАНИЕ:

Я получаю большее количество дней по сравнению с фактической суммой Дней.

public static int calculateDifference(Date a, Date b)
{
    int tempDifference = 0;
    int difference = 0;
    Calendar earlier = Calendar.getInstance();
    Calendar later = Calendar.getInstance();

    if (a.compareTo(b) < 0)
    {
        earlier.setTime(a);
        later.setTime(b);
    }
    else
    {
        earlier.setTime(b);
        later.setTime(a);
    }

    while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR))
    {
        tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
        difference += tempDifference;

        earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
    }

    if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR))
    {
        tempDifference = later.get(Calendar.DAY_OF_YEAR) - earlier.get(Calendar.DAY_OF_YEAR);
        difference += tempDifference;

        earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
    }

    return difference;
}

Примечание:

К сожалению, ни один из ответов не помог мне решить проблему. Я выполнил эту проблему с помощью Joda-разовой библиотеки.

81
задан Community 23 May 2017 в 11:53
поделиться

4 ответа

Я бы посоветовал вам использовать отличную библиотеку Joda Time вместо испорченных java.util.Date и друзей. Вы можете просто написать

import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Days;

Date past = new Date(110, 5, 20); // June 20th, 2010
Date today = new Date(110, 6, 24); // July 24th 
int days = Days.daysBetween(new DateTime(past), new DateTime(today)).getDays(); // => 34
149
ответ дан 24 November 2019 в 09:24
поделиться

Вы говорите, что «отлично работает в отдельной программе», но вы получаете «необычные значения разницы», когда «включаете это в мою логику для чтения из отчета». Это говорит о том, что в вашем отчете есть некоторые значения, для которых он работает некорректно, а ваша автономная программа не имеет этих значений. Вместо отдельной программы я предлагаю тестовый пример. Напишите тестовый пример, как если бы вы написали отдельную программу, создав подкласс от класса TestCase JUnit. Теперь вы можете запустить очень конкретный пример, зная, какое значение вы ожидаете (и не давайте его сегодня в качестве тестового значения, потому что сегодня со временем меняются). Если вы введете значения, которые использовали в автономной программе, ваши тесты, вероятно, пройдут. Это здорово - вы хотите, чтобы эти кейсы продолжали работать. Теперь добавьте значение из вашего отчета, которое не работает правильно. Ваш новый тест, вероятно, не удастся. Выясните, почему он не работает, исправьте это и получите зеленый цвет (все тесты пройдены). Запустите свой отчет. Посмотрите, что все еще сломано; написать тест; пусть это пройдет. Довольно скоро вы обнаружите, что ваш отчет работает.

1
ответ дан 24 November 2019 в 09:24
поделиться

Это зависит от того, что вы определяете как разницу. Сравнивать две даты в полночь можно.

long day1 = ...; // in milliseconds.
long day2 = ...; // in milliseconds.
long days = (day2 - day1) / 86400000;
13
ответ дан 24 November 2019 в 09:24
поделиться

Возможно, я уже слишком поздно присоединяюсь к игре, но какого черта? :)

Как вы думаете, это проблема с потоками? Например, как вы используете результаты этого метода? ИЛИ

Можем ли мы изменить ваш код, чтобы сделать что-нибудь более простое, например:

Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();
    calendar1.set(<your earlier date>);
    calendar2.set(<your current date>);
    long milliseconds1 = calendar1.getTimeInMillis();
    long milliseconds2 = calendar2.getTimeInMillis();
    long diff = milliseconds2 - milliseconds1;
    long diffSeconds = diff / 1000;
    long diffMinutes = diff / (60 * 1000);
    long diffHours = diff / (60 * 60 * 1000);
    long diffDays = diff / (24 * 60 * 60 * 1000);
    System.out.println("\nThe Date Different Example");
    System.out.println("Time in milliseconds: " + diff
 + " milliseconds.");
    System.out.println("Time in seconds: " + diffSeconds
 + " seconds.");
    System.out.println("Time in minutes: " + diffMinutes 
+ " minutes.");
    System.out.println("Time in hours: " + diffHours 
+ " hours.");
    System.out.println("Time in days: " + diffDays 
+ " days.");
  }
48
ответ дан 24 November 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: