Joda Time总和不同时间

时间:2015-04-09 20:17:33

标签: java jodatime

我使用joda time 2.7,我需要以LocalTime格式添加几次,忽略TimeZone和toDateTimeToday;

示例:

input(String ... times)

01:10 , 01:10 , 01:10 ,

01:10 , 01:10 , 01:10 , 01:10 , 01:10 , 01:10

预期产量(Millis)

03:30

或 预期产量(Millis)

07:00

我的意识

 
import org.joda.time.DateTimeZone;
import org.joda.time.Duration;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

static long sumAccumulatedTimes( long... listTimes ){

    Duration duration = Duration.ZERO;
    DateTimeZone zone = DateTimeZone.getDefault();
    DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
    for (int i = 0; i < listTimes.length; i++) { 
       duration = duration.plus( listTimes[i] ); // in iteration three, ocurred problems!
    } 
    long convertZone = zone.convertUTCToLocal( duration.getMillis() ); // Adjust TimeZone
    System.out.println("Output: " + fmt.print( convertZone  ) );
    return 0; // ignore !
 }




// Call method

  DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm"); 
  sumAccumulatedTimes(  
       fmt.parseMillis("01:10"),
       fmt.parseMillis("01:10")//, up to here Ok (02:20 ouput), next inconsitent values 
      // fmt.parseMillis("01:10") // add three parameters, is ocurred problems
    );

编辑:更新

解决 @Meno Hochschild

 
String[] input = { "12:00", "12:10" };
PeriodFormatter parser =
new PeriodFormatterBuilder()
.appendHours().appendLiteral(":")
.appendMinutes().toFormatter();
Period period = Period.ZERO;

for (String s : input) {
  period = period.plus(parser.parsePeriod(s));
 }

 PeriodFormatter printer =
  new PeriodFormatterBuilder()
  .printZeroAlways().minimumPrintedDigits(2)
 //.appendDays().appendLiteral(":") // remove original code
 .appendHours().appendLiteral(":")
 .appendMinutes().toFormatter();
 //System.out.println("duration=" +  // remove original code    //printer.print(period.normalizedStandard()));
// output: duration=01:00:10

 System.out.println("duration="                                        
  printer.print(period.normalizedStandard( PeriodType.time() )));
// output: duration= 24:10

其他解决方案,来自@Dexter:)

 
private static String sumAccumulatedTimes( String... times ){

    DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
    DateTimeZone zone = DateTimeZone.getDefault();
    PeriodFormatter pformat = new PeriodFormatterBuilder()
                                    .minimumPrintedDigits(2)
                                    .printZeroAlways()
                                    .appendHours()
                                    .appendLiteral(":")
                                    .appendMinutes()
                                    .toFormatter();

    long sum = 0;  
    for ( String time : times ) { 
        long parseLong = fmt.parseMillis( time );
        sum += zone.convertUTCToLocal( parseLong ); 
    } 
    Period period = new Period( sum );  
    return period.toString(pformat);
}

总和两个解决方案的工作时间,无限制地忽略时区24小时

谢谢。

3 个答案:

答案 0 :(得分:1)

请勿使用DateTimeFormatter来解析持续时间。该格式化程序用于及时格式化和解析点,并且无法处理任何时间溢出,并且还会尝试将任何计算的持续时间与时区问题(问题的根本原因)进行处理。在我的时区&#34;欧洲/柏林&#34;,表达式fmt.parseMillis("01:10")仅产生10分钟 - 而不是1小时10分钟。

请改用持续时间格式器。在Joda-Time中,这称为PeriodFormatter

String[] input = { "01:10", "01:10", "01:10", "01:10", "01:10", "01:10" };
PeriodFormatter pf =
  new PeriodFormatterBuilder()
  .minimumPrintedDigits(2).printZeroAlways()
  .appendHours().appendLiteral(":").appendMinutes().toFormatter();
Period period = Period.ZERO;

for (String s : input) {
  period = period.plus(pf.parsePeriod(s));
}

System.out.println("duration=" + pf.print(period.normalizedStandard()));
// output: duration=07:00

OP评论后更新(修复错误处理日溢出):

String[] input = { "12:00", "12:10" };
PeriodFormatter parser =
  new PeriodFormatterBuilder()
  .appendHours().appendLiteral(":")
  .appendMinutes().toFormatter();
Period period = Period.ZERO;

for (String s : input) {
  period = period.plus(parser.parsePeriod(s));
}

PeriodFormatter printer =
  new PeriodFormatterBuilder()
  .printZeroAlways().minimumPrintedDigits(2)
  .appendDays().appendLiteral(":")
  .appendHours().appendLiteral(":")
  .appendMinutes().toFormatter();
System.out.println("duration=" + printer.print(period.normalizedStandard()));
// output: duration=01:00:10

另一种解决方法是使用表达式period.normalizedStandard(PeriodType.time())以仅使用时钟单位。

答案 1 :(得分:0)

你可以添加毫秒。

   static long sumAccumulatedTimes(String ... array)
   {
      long sum = 0;
      for (String time : array)
      {
         sum += new LocalTime(time).getMillisOfDay();
      }
      return sum;
   }

结果将是相同的

<强> UPD
使用Joda API将long转换为字符串

   static String millisToString(long millis)
   {
      long hours = millis / (1000 * 60 * 60);
      long minutes = (millis / (1000 * 60)) % 60;
      return hours + ":" + (minutes < 10 ? "0" : "") + minutes;
   }

答案 2 :(得分:0)

@llya。

现在您的代码解决了这个问题! 但就我而言,它会产生我 使用这个长期的不兼容问题 在其他方法JODA。

e.g。

                                     //87600000
  static String parseMillisToTextTime( long time ){ 
      DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm"); 
      return fmt.print(time); 
  } // ouput 21:20


    System.out.println(  LocalTime.fromMillisOfDay(87600000).toString("HH:mm") );
  // output 00:20


   LocalTime lt = new LocalTime(87600000);
  System.out.println("output: " + lt.toString("HH:mm"));
  // output 21:20

让我改变这种方法 有很高的维护负担。

如果你想添加你的 有这些观察的解决方案吗?