Как найти разницу между двумя Joda-Time DateTimes в минутах

143

Ниже приведен метод, который я написал:

public List<Map<String, Object>> loadNotYetInEmployee(int shift, Date date,
        int transitionVal, String type, User user) {

    DateTime datetime = new DateTime(date);
    datetime = datetime
            .plus(Period.minutes(shiftTiming.getSession1InTime()));

    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

    sql = SqlMapUtils.getSql("attendance.attendancestatus.latein",
            parameters);
    result = getJdbcTemplate().queryForList(sql);
    for (int i = 0; i < result.size(); i++) {
        Date punchInTime = (Date) result.get(i).get("punchtime");
        DateTime punchTime = new DateTime(punchInTime);
    }
    return result;
}

Теперь из моего метода вы можете видеть, что у меня есть объект Joda-Time DateTime в названном объекте, datetimeи из моего результата я получаю одну временную метку, которую я конвертирую в jodatime punchTime. Теперь я хочу выяснить разницу между этими двумя датами, как мне это сделать?

Дипак Кумар
источник
9
Minutes # minutesBetween - ваш друг.
Луигги Мендоса,
2
Но это будет работать, только если ваши объекты DateTime находятся в одном часовом поясе.
Tiago
1
Days.daysBetween(d1, d2)является соседом вашего друга
Шубхам Чаудхари

Ответы:

79

Это даст вам разницу между двумя объектами DateTime в миллисекундах:

DateTime d1 = new DateTime();
DateTime d2 = new DateTime();

long diffInMillis = d2.getMillis() - d1.getMillis();
Альфредадей
источник
78
Ответ MadProgrammer должен был быть принятым ответом. Обратите внимание на простое использование Minutes.minutesBetween.
Basil Bourque
5
Нет, я не согласен, это слишком многословно и непонятно: «Минуты минут между временем удара и датой» хуже, чем «миллисекунды второй даты минус миллисекунды первой даты»
Джонатан Нойфельд
4
Это не будет учитывать переход на летнее время.
Сандер
456

Что-то типа...

DateTime today = new DateTime();
DateTime yesterday = today.minusDays(1);

Duration duration = new Duration(yesterday, today);
System.out.println(duration.getStandardDays());
System.out.println(duration.getStandardHours());
System.out.println(duration.getStandardMinutes());

Какие выходы

1
24
1440

или

System.out.println(Minutes.minutesBetween(yesterday, today).getMinutes());

Что, вероятно, больше то, что вам нужно

Безумный программист
источник
Учитываются ли вышеупомянутые часовые пояса? Или мне сначала нужно преобразовать в UTC / GMT?
Doo Dah
@DooDah. Хороший вопрос, я «верю», что да (как и полагает JodaTime LocalTime), но я бы посоветовал вам протестировать его и посмотреть. Однако возникает вопрос, в каком часовом поясе будет представлено полученное значение?
MadProgrammer
Я протестирую и выясню это. Для меня результирующий часовой пояс, скорее всего, будет сервером, на котором выполняется код. Я реализую запланированную очередь, и мне нужно будет вычислить количество времени между настоящим моментом и некоторым будущим временем на основе даты из другого часового пояса. Я сообщу, что найду.
Doo Dah
2
Я согласен, это должен был быть выбранный ответ. Его аккуратно и просто.
Сид
Создание нового объекта Duration только для того, чтобы увидеть разницу во времени, - это не круто. Представьте, что вам нужно измерить разницу во времени для большого массива объектов даты / времени.
AndroidDev
8

Что-то типа...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();
Карлос Чагендо
источник
Ошибка, если дата начала и окончания действительно далеко друг от друга (больше, чем размер int)
dannyRods
4
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

На практике я думаю, что это всегда будет давать тот же результат, что и ответ, основанный на Duration. Однако для другой единицы времени, чем минуты, это могло бы быть более правильным. Например, с 2016/2/2 по 2017/2/1 365 дней, но на самом деле это меньше 1 года и должно быть сокращено до 0 лет, если вы используете PeriodType.years().

Теоретически то же самое может происходить в течение нескольких минут из-за дополнительных секунд, но Joda не поддерживает дополнительные секунды.

Утренняя звезда
источник