3

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

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

4 回答 4

1

你有没有想过用天来表示每组 24 小时?您可以在 sumTime 方法中添加一些内容,并让它添加天数。SimpleDateFormater 可以使用天数,也许这会有所帮助:

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

于 2012-07-06T01:37:04.957 回答
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()));
于 2012-07-06T01:51:43.047 回答
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();
}
于 2012-07-06T02:08:12.400 回答
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
于 2012-07-06T03:26:28.240 回答