【问题标题】:Get Average Time using Joda Time使用 Joda Time 获取平均时间
【发布时间】:2014-01-02 21:03:00
【问题描述】:

我正在使用 Joda 时间段来汇总多个时间值。从 00:00:00 开始,我添加每个时间量以获得所有活动的总时间量。我想通过将所有时间值相加得到的总时间除以总距离得到每个测量单位的平均时间。

代码:

    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 以获得每单位的平均时间的最佳方法是什么?

【问题讨论】:

  • 你的变量 start 是什么意思?哪种类型?
  • 如何将时间转换为秒除以您的英里数,得到每英里的秒数?
  • 感谢 gfgaxiola,这是一种选择,但很好奇是否有功能可以在不转换的情况下按时执行除法。显然不是。
  • Meno - 起始变量是 MutablePeriod 类型。我用“00:00:00”时间初始化它,并用它把时间加在一起。

标签: java time distance jodatime average


【解决方案1】:

这是我迟到的答案:

  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 类型通常是更好的选择,它提供了您需要的规范化功能,并且可以长时间手动执行。

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多