2015-05-29 10 views
3

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

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

"5 часов и 103 минут"

"8 часов и 132 минут"

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

код: (с именами переменных изменены)

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)); 
      } 
     } 
    } 

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

+0

Я получил его, чтобы показать правильную информацию, добавив '.normalizedStandard()' после функции 'plus (p)'. Так оно работает, но почему это необходимо? – Yokich

ответ

2

Это описано поведение, проверить 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. 
... 
+0

«Каждое поле периода добавляется отдельно»! Спасибо, Баренд – Yokich