2014-01-02 4 views
2

Я использую период времени Joda для суммирования нескольких значений времени. Начиная с 00:00:00, я добавляю каждое количество времени, чтобы получить общее количество времени для всех видов деятельности. Я хотел бы взять общее время, найденное путем суммирования всех значений времени и деления на общее расстояние, чтобы получить среднее время на единицу измерения.Получите среднее время с помощью Joda Time

Код:

builder = new PeriodFormatterBuilder(); 
    builder.printZeroAlways() 
      .minimumPrintedDigits(2) 
      .appendHours() 
      .appendSeparator(":") 
      .appendMinutes() 
      .appendSeparator(":") 
      .appendSeconds(); 

    PeriodFormatter formatter = builder.toFormatter(); 
    PeriodParser parser = builder.toParser(); 

    String zero = "00:00:00"; 
    MutablePeriod start = new MutablePeriod(); 
    MutablePeriod adding = new MutablePeriod(); 
    parser.parseInto(start, zero, 0, Locale.getDefault()); 

    System.out.println("Orig Time: "+formatter.print(start)); 

    float total = 0; 

    for (Activity temp : last7acts) { 
     System.out.println(temp.getCatName()+" - "+temp.getTime()+" - "+temp.getDistance()+" "+temp.getUnits()); 
     total = total + temp.getDistance(); 
     String add = temp.getTime(); 
     parser.parseInto(adding, add, 0, Locale.getDefault()); 
     start.add(adding); 
     System.out.println("Adding Time: "+formatter.print(start)); 
     if (start.getSeconds() > 60) { 

      int origSeconds = start.getSeconds(); 
      int newMinutes = origSeconds/60; 
      int newSeconds = origSeconds % 60; 

      start.addMinutes(newMinutes); 
      start.setSeconds(newSeconds); 

     } 

     if (start.getMinutes() > 60) { 

      int origMinutes = start.getMinutes(); 
      int newHours = origMinutes/60; 
      int newMinutes = origMinutes % 60; 

      start.addHours(newHours); 
      start.setMinutes(newMinutes); 
     } 
     System.out.println("Altered Time: "+formatter.print(start)); 

    } 

    System.out.println("Final Distance: "+total); 
    System.out.println("Final Time: "+formatter.print(start)); 

Выход:

Orig Time: 00:00:00 

    Run - 00:16:08 - 2.0 miles 
    Adding Time: 00:16:08 
    Altered Time: 00:16:08 

    Run - 00:18:09 - 2.21 miles 
    Adding Time: 00:34:17 
    Altered Time: 00:34:17 

    Run - 00:23:35 - 2.69 miles 
    Adding Time: 00:57:52 
    Altered Time: 00:57:52 

    Run - 00:34:45 - 4.29 miles 
    Adding Time: 00:91:97 
    Altered Time: 01:32:37 

    Run - 00:36:15 - 4.17 miles 
    Adding Time: 01:68:52 
    Altered Time: 02:08:52 

    Run - 00:18:03 - 2.14 miles 
    Adding Time: 02:26:55 
    Altered Time: 02:26:55 

    Run - 00:17:27 - 2.19 miles 
    Adding Time: 02:43:82 
    Altered Time: 02:44:22 

    Run - 00:43:43 - 5.1 miles 
    Adding Time: 02:87:65 
    Altered Time: 03:28:05 

    Distance: 24.79 
    Final Time: 03:28:05 

Что бы быть лучшим подходом для разделения конечного времени 03:28:05 по 24.79, чтобы получить среднее время на единицу?

+0

Что означает ваша переменная? Какого вида? –

+2

Как насчет того, чтобы преобразовать время в секунды, разделите ваши мили, и вы получите сколько секунд за милю? – gtgaxiola

+0

Спасибо gfgaxiola, это был один из вариантов, но было любопытно, есть ли возможность выполнять деление вовремя без преобразования. Очевидно нет. – user3137729

ответ

0

Вот мой покойный ответ:

PeriodFormatterBuilder builder = new PeriodFormatterBuilder(); 

    PeriodFormatter formatter = 
    builder.printZeroAlways() 
     .minimumPrintedDigits(2) 
     .appendHours() 
     .appendSeparator(":") 
     .appendMinutes() 
     .appendSeparator(":") 
     .appendSeconds() 
     .toFormatter(); 

    String zero = "00:00:00"; 
    Period period = formatter.parsePeriod(zero); 
    float total = 0; 

    for (Activity temp : last7acts) { 
    System.out.println(
     temp.getCatName() + " - " + temp.getTime() 
     + " - " + temp.getDistance() + " " + temp.getUnits()); 
    total += temp.getDistance(); 
    period = period.plus(formatter.parsePeriod(temp.getTime())); 
    } 

    period = period.normalizedStandard(PeriodType.dayTime().withDaysRemoved()); 
    System.out.println("Final Distance: " + total); 
    System.out.println("Final Time: " + formatter.print(period)); 

    long secs = period.toStandardDuration().getStandardSeconds(); 
    NumberFormat nf = NumberFormat.getInstance(Locale.getDefault()); 
    System.out.println(nf.format(secs/total) + " seconds/mile"); 

    long minutes = secs/60; 
    System.out.println(nf.format(minutes/total) + " minutes/mile"); 

Посмотрите, как короткий цикл стал! Неизменяемый тип Period, в общем, лучший выбор, и он предлагает нормализующие возможности, что вам нужно, и пытался сделать вручную в длительном режиме.

Смежные вопросы