总结时间超过24小时

时间:2012-07-06 01:32:02

标签: java time calendar hour

我有以下方法来总结时间:

public static String sumTime(String date1, String date2) throws ParseException {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");

    Date d1 = formatter.parse(date1);
    Date d2 = formatter.parse(date2);
    calendar.setTime(d2);

    d1 = DateUtils.addHours(d1, calendar.get(Calendar.HOUR_OF_DAY));
    d1 = DateUtils.addMinutes(d1, calendar.get(Calendar.MINUTE));
    d1 = DateUtils.addSeconds(d1, calendar.get(Calendar.SECOND));
    d1 = DateUtils.addMilliseconds(d1, calendar.get(Calendar.MILLISECOND));

    return formatter.format(d1);
}

DateUtils来自Apache Commons Lang 3
除非总和大于24小时,否则它对我想要的效果非常好。


例如:

String time = "00:00:00.000";

try {
    for (int i = 0; i < 24; i++) {
            time = sumTime(time, "01:00:00.123");
    }

    System.out.println(time);
} catch (ParseException e) {
    e.printStackTrace();
}

结果是:

00:00:02.952

但这就是我想要的:

24:00:02.952


是否有任何(简单)方法可以实现这一目标? 我不介意使用不同的库/方法,只要我得到正确的结果。


请记住,时间总是在00:00:00.000开始;

4 个答案:

答案 0 :(得分:1)

您是否考虑过使用天数代表每组24小时?您可以在sumTime方法中添加一些内容,并让它添加天数。 SimpleDateFormater可以使用几天,也许这会有所帮助:

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

答案 1 :(得分:1)

java.util.Date在这方面并不是那么强大。有关正确处理此问题的库,请参阅Joda Time

我刚才无法访问安装。代码将接近于此:

DateTimeFormatter dtf = DateTimeFormat.forPattern("HH:mm:ss.SSS");
DateTime start = dtf.parseDateTime(date1);
DateTime end = dtf.parseDateTime(date2);
PeriodFormatter pf = new PeriodFormatterBuilder()
 .printZeroAlways().appendHours().appendSeparator(":")
 .appendMinutes().appendSeparator(":")
 .appendSeconds().appendSeparator(":")
 .appendMillis3Digit().toFormatter();
return pf.print(new Period(start, end, PeriodType.time()));

答案 2 :(得分:0)

Date不适合使用。 Date是一个时刻,而不是“日期差异”。

正确的做法是使用像Joda Time这样的库,就像有人建议的那样。如果你不想这样做 - 这里有一个可能的选择:

自己将字符串解析为小时,分钟和秒,然后自行添加。

我鼓励你去看一个“很受欢迎”的图书馆。在我的解决方案中可能有一些我没有想到的事情。此外,您还添加了所有错误检查。

以下是入门代码:

public class TimeInterval {
short milliSeconds;
short seconds;
short minutes;
int hours;

public TimeInterval (String dateString) {
    // HHHHHH:MI:SS.SSS
    Pattern pattern = Pattern.compile("(\\d+):(\\d\\d):(\\d\\d)\\.(\\d\\d\\d)");
    Matcher matcher = pattern.matcher(dateString);
    if ( matcher.find() ) {
        hours = Integer.parseInt(dateString.substring(matcher.start(1), matcher.end(1)));
        minutes = Short.parseShort(dateString.substring(matcher.start(2), matcher.end(2)));
        seconds = Short.parseShort(dateString.substring(matcher.start(3), matcher.end(3)));
        milliSeconds = Short.parseShort(dateString.substring(matcher.start(4), matcher.end(4)));
    }
}

private TimeInterval() {
}

public TimeInterval add(TimeInterval interval) {
    TimeInterval ret = new TimeInterval();
    ret.milliSeconds = (short) ((interval.milliSeconds + milliSeconds)%1000);
    int carry = (interval.milliSeconds + milliSeconds)/1000;
    ret.seconds = (short) ((interval.seconds + seconds)%60 + carry );
    carry =(interval.seconds + seconds)/60;
    ret.minutes = (short) ((interval.minutes + minutes)%60 + carry);
    carry = (interval.minutes + minutes)/60;
    ret.hours = (interval.hours + hours + carry);
    return ret;
}

@Override
public String toString() {
    return String.format("%d:%02d:%02d.%03d", hours, minutes, seconds, milliSeconds);
}
}

使用此课程,您的课程将如下:

TimeInterval time = new TimeInterval("00:00:00.000");

try {
    for (int i = 0; i < 24; i++) {
      time = time.add(new TimeInterval("01:00:00.123"));
    }

    System.out.println(time.toString());
} catch (ParseException e) {
    e.printStackTrace();
}

答案 3 :(得分:0)

你有没有尝试过直接支持这类事情的Joda-Time?

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

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

    String s1 = "11:00:00.111";
    String s2 = "23:00:00.111";

    MutablePeriod p1 = new MutablePeriod();
    MutablePeriod p2 = new MutablePeriod();
    parser.parseInto(p1, s1, 0, Locale.getDefault());       
    parser.parseInto(p2, s2, 0, Locale.getDefault());       
    p1.add(p2);


    System.out.println(formatter.print(p1));

打印

34:00:00.222