Как найти разницу между двумя 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. Теперь я хочу выяснить разницу между этими двумя датами, как мне это сделать?



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 не поддерживает дополнительные секунды.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.