Java 以MM:SS格式比较两次

Java 以MM:SS格式比较两次,java,time,Java,Time,我希望用MM:SS格式比较两次,并在几秒钟内得到这两次之间的差异 例如 时间1=20:28 ,时间2=20:18 差是-10秒 我试着用下面的方法来比较时间 LocalTime start = LocalTime.parse( "20:28" ); LocalTime stop = LocalTime.parse( "20:18" ); Duration duration = Duration.between( start, stop );

我希望用MM:SS格式比较两次,并在几秒钟内得到这两次之间的差异

例如 时间1=20:28 ,时间2=20:18

差是-10秒

我试着用下面的方法来比较时间

        LocalTime start = LocalTime.parse( "20:28" );
        LocalTime stop = LocalTime.parse( "20:18" );
        Duration duration = Duration.between( start, stop );
        System.out.println(duration.getSeconds());
实际值:这将打印
-600
秒作为输出,因为时间是以HH:MM格式解析的

预期的
-10

    LocalTime start = LocalTime.parse( "00:20:28" );
    LocalTime stop = LocalTime.parse( "00:20:18" );
    Duration duration = Duration.between( start, stop );
    System.out.println(duration.getSeconds());

考虑到MM:SS格式,是否有其他方法可以获得预期的输出。

问题是您不能使用只有分钟和秒的格式化程序,小时是必需的。一种可能的方法是在字符串前加一个默认小时:

LocalTime start = LocalTime.parse("00:20:28");
LocalTime stop = LocalTime.parse("00:20:18");
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());
输出:
-10

    LocalTime start = LocalTime.parse( "00:20:28" );
    LocalTime stop = LocalTime.parse( "00:20:18" );
    Duration duration = Duration.between( start, stop );
    System.out.println(duration.getSeconds());
另一种可能的方法是使用的
方法和默认小时数:

LocalTime start = LocalTime.of(0, 20, 28);
LocalTime stop = LocalTime.of(0, 20, 18);
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());
输出:
-10

    LocalTime start = LocalTime.parse( "00:20:28" );
    LocalTime stop = LocalTime.parse( "00:20:18" );
    Duration duration = Duration.between( start, stop );
    System.out.println(duration.getSeconds());

您以错误的方式保存日期。你还必须提供一个小时。当你通过2个参数(20:18)时,它首先考虑为每小时一秒。这就是它返回600秒的原因。600秒等于10分钟。这是两个参数之间的时间差

由于
LocalTime
似乎无法使用
mm:ss
DateTimeFormatter
模式,您还可以创建一个简短的
静态
辅助方法来代替调用

此方法将所有解析的默认小时设置为相同的值,这不会在其他任何地方公开
“00:
,如果意外输入了不同的小时,则可能会出现错误

这将确保分钟和秒之间的任何
持续时间都是准确的:

public static void main(String [] args) {
    LocalTime start = parseHelper("20:28");
    LocalTime stop = parseHelper("20:18");
    Duration duration = Duration.between(start, stop);
    System.out.println(duration.getSeconds());
}

private static LocalTime parseHelper(String str) {
    return LocalTime.parse("00:" + str);
}
输出:

-十,

编辑:

这强化了
hours
LocalTime
中不是可选的,显然
minutes
也不是可选的

在这里,您可以看到它们列出了
toString()
方法中可能的值

输出将是以下ISO-8601格式之一:


您可能错误地使用了
LocalTime

假设你想要你说你想要的,诀窍是定义一个格式化程序,假设一天中的小时数为0。我们需要的是
DateTImeFormatterBuilder
parseDefaulting
方法:

    DateTimeFormatter mmssFormatter = new DateTimeFormatterBuilder()
            .appendPattern("mm:ss")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter();

    LocalTime start = LocalTime.parse( "20:28", mmssFormatter );
    LocalTime stop = LocalTime.parse( "20:18", mmssFormatter );
    Duration duration = Duration.between( start, stop );
    System.out.println(duration.getSeconds());
输出为:

-十,

时间字符串被解析为00:20:28和00:20:18的时间。我不明白的是把自己限制在晚上00:00:00到01:00:00之间有什么意义。相反,如果您的时间是相对于某个不一定是00:00的点,那么对它们使用
持续时间可能更为正确。其想法是20:28不是一天中的某个时间,但可以被视为测量基准和开始时间之间的持续时间。然后可以减去持续时间:

    Duration relativeStart = parseDuration("20:28");
    Duration relativeStop = parseDuration("20:18");
    Duration duration = relativeStop.minus(relativeStart);
    System.out.println(duration.getSeconds());
我使用这个辅助方法:

private static Duration parseDuration(String timeString) {
    String isoTimeString = timeString.replaceFirst("(\\d{2}):(\\d{2})", "PT$1M$2S");
    return Duration.parse(isoTimeString);
}
由于
Duration.parse
只能解析ISO 8601格式的字符串,如
PT20M28S
,因此我使用正则表达式将字符串转换为这种格式


输出与以前相同。

“您不能拥有只有几分钟和几秒钟的格式化程序”-这不是真的。OP的代码不起作用的原因是没有
DateTimeFormatter
可以将
mm:ss
解析为
LocalTime
对象。@JacobG。即使使用
DateTimeFormatter.ofPattern(“mm:ss”)
创建一个
DateTimeFormatter
,您也会得到一个异常,该异常会在添加小时后消失。所以,也许我遗漏了什么,但在我看来,
DateTimeFormatter
在处理时间时希望给定的格式包含小时
,抛出
java.time.format.DateTimeParseException
。我知道我可以将00作为前缀添加到时间并继续,但我不确定这是否是唯一的方法。@在您的特定情况下,问题是大写字母M代表月份,大写字母S代表毫秒,您必须使用
mm:ss
。但这也行不通