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

Java添加日期格式dd:HH:mm:ss,java,date,simpledateformat,addition,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.pars

我有三个日期作为
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);
输出(错误):


上面的和是算术加法,所以需要一个ref——这里是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);

注:-添加日期并非易事,请三思。

dd格式包括每月的日期。因此,如果使用
SimpleDataFormat
(或Java
Date
,则
00
的值将下溢,因为它还包括一个月中的一天)。相反,分析你的时间部分,自己做数学

例如,您可以创建一个类
TimePart
,其中包含
days
hours
minutes
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

输出:04:19:18

字符串是否表示/表示时间量?因此,请使用
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秒。或者可选
P0DT1H9M14S
。持续0天的
0D
T
之前。因此,在解析之前,我使用正则表达式(也称为正则表达式)将字符串格式修改为ISO8601。替换字符串中的
$1
$2
等表示圆括号内匹配的内容,即正则表达式中的所谓组

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

    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
类的设计很差,而且您也尝试使用的
SimpleDateFormat
类是出了名的麻烦。幸运的是,我们在这里没有使用它们,对于日期和时间,它们早已过时,被java.time取代,后者是现代java日期和时间API,
Duration
只是众多类中的一个

链接
  • 解释如何使用java.time
  • 关于……的文件…
    • 关于正则表达式的使用
  • );一些答案使用
    持续时间
    课程

您希望如何添加日期?什么是“2008年12月14日”加上“2013年10月12日”?似乎想做同样的事情。简言之,求出自历元以来的毫秒总数,并根据结果创建一个新的日期。@mattias:请注意,您所链接的问题的公认答案是完全错误的。@jambjo:是的,考虑到这一点,我想与其求和实际日期值,不如计算两个“计时器值”表示为日期对象。如您所言,将2008年与2013年相加的好处/业务价值是什么。仅供参考,存在严重缺陷的日期时间类,如和
java.text.SimpleDateFormat
现在,被Java 8和更高版本中内置的类所取代。答案是关于您对获得o/p
00:7:59:07
的期望。。例如:01:02:03+10:12:13=11:14:16(1)
Calendar
类早已过时,设计拙劣。我建议我们不要使用它。(2) 日历是一天中的日期和时间(带有时区、周编号方案等)。这不是一个持续时间,一个时间量。这是你在那里做的一些奇特的正则表达式!我建议你加上一句话,说它实际上是regex,让那些可能不知道的读者知道。我会在源代码之前先提到regex。这就像是一段叙述,告诉我当我的眼睛移动来研究代码时会发生什么。谢谢@BasilBourque的建议。我明白你的意思。我的风格更多的是先呈现具体的代码,然后再解释。作为妥协?不,我认为这样做实际上很有帮助,我在代码行前面的代码注释中提到了正则表达式。
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");    
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);
}
    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);