Як знайти різницю між двома датами часу Joda-Time в хвилинах


141

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

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 знаходяться в одній часовій зоні.
Тіаго

1
Days.daysBetween(d1, d2)є сусідом Вашого друга
Shubham Чаудхари

Відповіді:


79

Це дозволить отримати різницю між двома об'єктами DateTime в мілісекундах:

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

long diffInMillis = d2.getMillis() - d1.getMillis();

78
Відповідь MadProgrammer повинна була прийняти відповідь. Зауважте про просте використання Minutes.minutesBetween.
Василь Бурк

5
Ні, я не погоджуюсь, це занадто багатослівно і незрозуміло: "Хвилини хвилин між часом дати перфорації" гірші, ніж "мілісекунда дати другої дати мінус перша мілісекунда дати"
Джонатан Нойфельд,

4
Це не враховує економію денного світла.
Сандер Верслуйс

454

Щось на зразок...

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
Я згоден, це повинна була бути обраною відповіддю. Його акуратно і просто.
Сид

Створення нового об’єкта "Тривалість" просто для отримання різниці у часі просто не круто. Уявіть, що потрібно виконати різницю у часі на великому масиві об’єктів дати / часу.
AndroidDev

7

Щось на зразок...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();

Не виходить, якщо дата початку та закінчення дійсно далеко одна від одної (більше, ніж розмір int)
dannyRods

3
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().

Теоретично те саме може трапитися хвилин через високосні секунди, але Джода не підтримує високосні секунди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.