如何在Java中求和两个特定的日期

时间:2020-05-05 14:39:01

标签: java date sum

如何在Java中添加两个日期

示例:“ 2020-05-06 13:10:00”和“ 0000-00-00 01:10:00”的总和将得出“ 2020-05-06 14:20:00”

我尝试了类似的方法,但是它不起作用:

enter image description here

谢谢!

2 个答案:

答案 0 :(得分:3)

对于初学者,请使用新的API。用几秒钟的时间代表一个正确类型的概念。

例如,java.util.Date代表时间(而不是日期;它的名字很糟糕)。它当然不代表“ 10分钟”的概念。

在正确的(新的)API中,用人类表达的时间为ZonedDateTime 10分钟的概念将是Duration(持续时间具有固定的时间量。时间段较为模糊;一个月的持续时间可变,因此是一个时间段; 10分钟始终是相同的时间,因此是持续时间。

Duration d = Duration.ofMinutes(10);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse("2020-05-06 13:10:00", dtf);

请注意,您的输入时间没有时区,也没有位置。因此,LocalDateTime是代表它的正确类型。

但这是一个问题:LDT并不能真正让您添加或删除期间/期限。例如在阿姆斯特丹,如果将时间“ 2020-03-29 01:30:00”加一个小时,则会导致...“ 2020-03-29 03:30:00”-是的,SEEMS就像2个小时,但只有一个小时过去了。那是时钟向前调一个小时的确切时间点。这说明了为什么不将时间单位置于我们所在时区的上下文中就不可能添加或删除时间单位。

因此,您无法在这里做自己想做的;您必须先对其进行“本地化”。让我们继续:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Amsterdam"));
ZonedDateTime modified = zdt.plus(d);
System.out.println(dtf.format(modified));

,并根据需要打印2020-05-06 13:20:00

答案 1 :(得分:1)

使用正则表达式将第二个字符串解析为数字部分,并添加到第一个字符串的日期/时间值。

赞:

public static LocalDateTime add(LocalDateTime datetime, String interval) {
    Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})");
    Matcher m = p.matcher(interval);
    if (! m.matches())
        throw new IllegalArgumentException("Invalid interval: " + interval);
    Period period = Period.of(Integer.parseInt(m.group(1)),
                              Integer.parseInt(m.group(2)),
                              Integer.parseInt(m.group(3)));
    int seconds = (Integer.parseInt(m.group(4)) * 60 +
                   Integer.parseInt(m.group(5))) * 60 +
                  Integer.parseInt(m.group(6));
    return datetime.plus(period).plusSeconds(seconds);
}

测试

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDateTime datetime = LocalDateTime.parse("2020-05-06 13:10:00", fmt);
System.out.println(add(datetime, "0000-00-00 01:10:00").format(fmt));

输出

2020-05-06 14:20:00