Joda Period не конвертирует все минуты в часы 8h, 132m

Я храню два DateTimes (Joda) в объекте, а затем получаю Period из объекта с помощью new Period(dateTime1, dateTime2). Затем я хочу добавить все периоды из разных объектов вместе. Я одновременно складываю все периоды в переменную и суммирую некоторые периоды в меньших периодах, хранящихся в HashMap<long, Period>.

Результат и проблема такова. Первый период получает «2 часа и 30 минут» с PeriodFormat.getDefault().print(p) (значения одинаковы, если я объединяю getHours и getMinutes). Второе значение «5 часов 52 минуты». Все идет нормально. Но когда я делаю это с 3-й и 4-й, минуты перестают конвертироваться в часы.

«5 часов и 103 минуты»

«8 часов 132 минуты»

Должно быть 10ч и 12м, но как видите. Это не то, что я получаю. В чем проблема? Как Period может просто забыть сделать преобразование? У меня пока нет проблем с выбранными суммами.

code: (с измененными именами переменных)

mainSum= new Period();
tasksSum= new HashMap<Long, Period>();
for(Entry entry: entries){
        long main_id= entry.getMain_id();
        long task_id = entry.getTask_id();
        Period entryPeriod = entry.getPeriod();

        if(main_id == mainStuff.getId()){
            mainSum = entryPeriod.plus(mainSum);
            Timber.d("mainSum: " + PeriodFormat.getDefault().print(mainSum));
            Timber.d("sum of workplace: " + mainSum.getHours() + " : " + mainSum.getMinutes());
            Period taskPeriod = tasksPeriodSums.remove(task_id);
            if(taskPeriod == null){
                tasksPeriodSums.put(task_id, entryPeriod);
            } else {
                tasksPeriodSums.put(task_id, taskPeriod.plus(entryPeriod));
            }
        }
    }

Пожалуйста, помогите, спасибо :)


person Yokich    schedule 29.05.2015    source источник
comment
Я получил его, чтобы показать правильную часть информации, добавив .normalizedStandard() после функции plus(p). Так это работает, но зачем это нужно?   -  person Yokich    schedule 29.05.2015


Ответы (1)


Это задокументированное поведение, ознакомьтесь с Javadoc для plus(Period):

/**
 * Returns a new period with the specified period added.
 * <p>
 * Each field of the period is added separately. Thus a period of
 * 2 hours 30 minutes plus 3 hours 40 minutes will produce a result
 * of 5 hours 70 minutes - see {@link #normalizedStandard()}.
 * <p>
...

Детализация Javadoc для normalizedStandard(..), мы видим компромисс:

/**
 * Normalizes this period using standard rules, assuming a 12 month year,
 * 7 day week, 24 hour day, 60 minute hour and 60 second minute,
 * 
...
 * However to achieve this it makes the assumption that all years are
 * 12 months, all weeks are 7 days, all days are 24 hours,
 * all hours are 60 minutes and all minutes are 60 seconds. This is not
 * true when daylight savings time is considered, and may also not be true
 * for some chronologies.
...
person Barend    schedule 29.05.2015
comment
Каждое поле периода добавляется отдельно! Спасибо, Баренд. - person Yokich; 30.05.2015