Java添加格式为dd的日期:HH:mm:ss

时间:2014-11-06 17:52:43

标签: java date simpledateformat addition

我有三个日期作为String个对象,格式为:dd:HH:mm:ss

  • 00:1:9:14
  • 00:3:10:4
  • 00:3:39:49

如何在Java中添加这些日期以获得总和(00:7:59:07)?

示例代码:

SimpleDateFormat sdf = new SimpleDateFormat("dd:HH:mm:ss");
Date d1 = sdf.parse("00:1:9:14");
Date d2 = sdf.parse("00:3:10:4");
Date d3 = sdf.parse("00:3:39:49");

System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
Date d = new Date(d1.getTime() + d2.getTime() + d3.getTime());

System.out.println(d);

输出(错误的):

Wed Dec 31 01:09:14 IST 1969
Wed Dec 31 03:10:04 IST 1969
Wed Dec 31 03:39:49 IST 1969
Sun Dec 28 20:59:07 IST 1969

5 个答案:

答案 0 :(得分:2)

dd格式包含该月的某一天。因此,如果您使用00(或Java SimpleDateFormat,那么Date的值将会下溢,因为它还包括该月的某一天。相反,解析你的时间部分并自己做数学。

例如,您可以使用TimePartdayshoursminutes创建类seconds

static class TimePart {
    int days = 0;
    int hours = 0;
    int minutes = 0;
    int seconds = 0;

    static TimePart parse(String in) {
        if (in != null) {
            String[] arr = in.split(":");
            TimePart tp = new TimePart();
            tp.days = ((arr.length >= 1) ? Integer.parseInt(arr[0]) : 0);
            tp.hours = ((arr.length >= 2) ? Integer.parseInt(arr[1]) : 0);
            tp.minutes = ((arr.length >= 3) ? Integer.parseInt(arr[2]) : 0);
            tp.seconds = ((arr.length >= 4) ? Integer.parseInt(arr[3]) : 0);
            return tp;
        }
        return null;
    }

    public TimePart add(TimePart a) {
        this.seconds += a.seconds;
        int of = 0;
        while (this.seconds >= 60) {
            of++;
            this.seconds -= 60;
        }
        this.minutes += a.minutes + of;
        of = 0;
        while (this.minutes >= 60) {
            of++;
            this.minutes -= 60;
        }
        this.hours += a.hours + of;
        of = 0;
        while (this.hours >= 24) {
            of++;
            this.hours -= 24;
        }
        this.days += a.days + of;
        return this;
    }

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

然后你的测试用例如

public static void main(String[] args) {
    try {
        TimePart d1 = TimePart.parse("00:1:9:14");
        TimePart d2 = TimePart.parse("00:3:10:4");
        TimePart d3 = TimePart.parse("00:3:39:49");
        System.out.println(d1);
        System.out.println(d2);
        System.out.println(d3);
        TimePart d4 = d1.add(d2).add(d3);
        System.out.println(d4);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它似乎正确执行添加

00:01:09:14
00:03:10:04
00:03:39:49
00:07:59:07

答案 1 :(得分:1)

上面的和是算术加法所以你需要一个ref --here d0(默认纪元)。日期类有很多问题要小心......

SimpleDateFormat sdf = new SimpleDateFormat("dd:HH:mm:ss");
Date d0 = sdf.parse("00:00:00:00"); // ref 
Date d1 = sdf.parse("00:01:09:14");
Date d2 = sdf.parse("00:03:10:04");
Date d3 = sdf.parse("00:03:39:49");

System.out.println(d0);
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
Date d = new Date(d1.getTime() + d2.getTime() + d3.getTime() - 2 * d0.getTime()); // impt

System.out.println(d);

注意: - 添加日期不是一件容易的事,请三思。

答案 2 :(得分:1)

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");    

String s1 = "01:02:03";
String s2 = "10:12:13";

Date d1 = format.parse(s1);
Date d2 = format.parse(s2);

int sec = d1.getSeconds() + d2.getSeconds();
int min = d1.getMinutes() + d2.getMinutes();
int hr = d1.getHours() + d2.getHours();

Time sum = new Time(hr, min, sec);
System.out.println(sum); // Output: 11:14:16

答案 3 :(得分:1)

您的字符串代表/表示时间量吗?因此,请使用Duration类。首先,我们编写一个辅助方法,将字符串解析为Duration

private static Duration parseDuration(String timeString) {
    // First convert the string to ISO 8601 through a regex
    String isoTimeString = timeString.replaceFirst("^(\\d+):(\\d+):(\\d+):(\\d+)$", "P$1DT$2H$3M$4S");
    // Then parse into Duration
    return Duration.parse(isoTimeString);
}

Duration.parse()需要ISO 8601格式,类似于PT1H9M14S的使用时间为1小时9分14秒。或可选地P0DT1H9M14S0D持续0天的时间早于T。因此,在解析之前,我使用正则表达式(又称​​ regex )将您的字符串格式修改为ISO 8601。替换字符串中的$1$2等是指圆括号内匹配的内容,即正则表达式中的 groups

现在我们可以将时间加起来:

    String[] timeStrings = { "00:1:9:14", "00:3:10:4", "00:3:39:49" };

    Duration totalTime = Duration.ZERO;
    for (String timeString : timeStrings) {
        Duration dur = parseDuration(timeString);
        totalTime = totalTime.plus(dur);
    }

    System.out.println(totalTime);

输出:

PT7H59M7S

7小时59分7秒。如果需要,可以将其格式化为00:7:59:07的格式。搜索方式。

您的代码出了什么问题?

您的第一个错误似乎是在编写代码之前:将时代视为日期。它们不是,添加日期也没有任何意义。 4月7日和12月25日的总和是多少?

由于这种想法的误导,您试图解析为Date个对象。 Date是时间上的,而不是时间上的数量,所以这是错误的。除了Date类的设计不良之外,您还尝试使用的SimpleDateFormat类非常麻烦。幸运的是,在这里我们没有用到它们,对于它们已经过时的日期和时间也没有用,由现代Java日期和时间API java.time取代,其中Duration只是许多类之一。

链接

答案 4 :(得分:0)

private static String addTimes(String time1, String time2) throws ParseException {
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(dateFormat.parse(time1));
    c2.setTime(dateFormat.parse(time2));

    c1.add(Calendar.HOUR, c2.get(Calendar.HOUR));
    c1.add(Calendar.MINUTE, c2.get(Calendar.MINUTE));
    c1.add(Calendar.SECOND, c2.get(Calendar.SECOND));
    return dateFormat.format(c1.getTime());
}

addTimes("1:9:14", "3:10:4");    

输出: 04:19:18