Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中添加两个时间字符串_Java_String - Fatal编程技术网

在Java中添加两个时间字符串

在Java中添加两个时间字符串,java,string,Java,String,在java中,我尝试使用一种自定义格式的时间刻度,然后尝试将其添加到另一个时间刻度,并以相同的格式输出。 我的日期格式为11D23H13M12S。然后我想把这个字符串,添加到类似1d 0h 0m 3s的东西中。然后输出12d 23h 13m 15s。 感谢您的帮助。一般来说,如果您试图操纵时间,最好使用专用类来实现这一目的-在Java 8中,您希望手动将两个字符串解析为Java.time.Durations,使用Duration.plus(Duration)添加它们,然后使用Duration的各

在java中,我尝试使用一种自定义格式的时间刻度,然后尝试将其添加到另一个时间刻度,并以相同的格式输出。 我的日期格式为11D23H13M12S。然后我想把这个字符串,添加到类似1d 0h 0m 3s的东西中。然后输出12d 23h 13m 15s。
感谢您的帮助。

一般来说,如果您试图操纵时间,最好使用专用类来实现这一目的-在Java 8中,您希望手动将两个字符串解析为
Java.time.Duration
s,使用
Duration.plus(Duration)
添加它们,然后使用Duration的各种
to*
方法来构建结果字符串


如果您对输入和输出格式有一定的控制权,您可以更改它们以匹配Duration的格式,并在那里节省一些精力。

我认为您需要一个StringBuilder这里:

例如:

StringBuilder和SystemFormat(您可以创建新字符串)


如果要从头开始实现,可以使用正则表达式并执行一些计算:

package stackoverflow;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    static Pattern p = Pattern.compile("(\\d+)d (\\d+)h (\\d+)m (\\d+)s");

    private static void add(String s, int[] a) {
        Matcher m = p.matcher(s);
        m.find();       
        for (int i = 0; i < a.length; i++)
            a[i] += Integer.parseInt(m.group(i + 1));
    }

    private static String calculate(String s1, String s2) {
        int a[] = new int[4];
        add(s1, a);
        add(s2, a);
        if (a[3] >= 60) {
            a[3] -= 60;
            a[2]++;
        }
        if (a[2] >= 60) {
            a[2] -= 60;
            a[1]++;
        }
        if (a[1] >= 24) {
            a[1] -= 24;
            a[0]++;
        }
        return String.format("%dd %dh %dm %ds", a[0], a[1], a[2], a[3]);
    }

    public static void main(String args[]) {
        String s1 = "11d 24h 13m 12s";
        String s2 = "1d 0h 0m 3s";
        System.out.println(calculate(s1, s2));
    }
}

上面的实现没有提供任何形式错误输入的检查。

可能重复@user3208218我很好奇为什么
11d 24h 13m 12s
+
12d 24h 13m 12s
=
13d 24h 13m 12s
?是的,很抱歉我在写它的时候把自己弄糊涂了。我现在就更改另一个问题是,您似乎希望
24小时
的输出不会更改为额外的一天。你确定吗?只是为了让措辞更清楚,你不需要添加两个字符串,而是将两个字符串解析为时间段,添加这些时间段,然后将它们再次打印为字符串。这就是为什么我说使用例如
Duration.toHours
Duration.toMinutes
,来构建结果字符串的原因,等等。但是将一个
持续时间
的日部分为11的持续时间添加到
持续时间
的日部分为
12的持续时间
,永远不会在结果的
持续时间
的日部分中为您提供
13的持续时间,这正是OP所希望的。因此,评论要求OP澄清他的请求。好吧,我对Java非常陌生,所以这对我来说没有多大意义。你能不能帮我把它说得小声一点?感谢基于这些评论,OP在给出的示例中似乎犯了一些小错误。我不会太在意那些细节。这真的不能解决问题。这似乎对我有用。谢谢。但是为了挑剔,我在bukkit服务器插件中使用了这个命令,当我在消息中使用该命令返回值时,结果在末尾有一个小符号。如果你知道bukkit,你可能知道如何解决这个问题。如果没有,那没关系。无论如何谢谢你
package stackoverflow;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    static Pattern p = Pattern.compile("(\\d+)d (\\d+)h (\\d+)m (\\d+)s");

    private static void add(String s, int[] a) {
        Matcher m = p.matcher(s);
        m.find();       
        for (int i = 0; i < a.length; i++)
            a[i] += Integer.parseInt(m.group(i + 1));
    }

    private static String calculate(String s1, String s2) {
        int a[] = new int[4];
        add(s1, a);
        add(s2, a);
        if (a[3] >= 60) {
            a[3] -= 60;
            a[2]++;
        }
        if (a[2] >= 60) {
            a[2] -= 60;
            a[1]++;
        }
        if (a[1] >= 24) {
            a[1] -= 24;
            a[0]++;
        }
        return String.format("%dd %dh %dm %ds", a[0], a[1], a[2], a[3]);
    }

    public static void main(String args[]) {
        String s1 = "11d 24h 13m 12s";
        String s2 = "1d 0h 0m 3s";
        System.out.println(calculate(s1, s2));
    }
}
13d 0h 13m 15s