为了账号安全,请及时绑定邮箱和手机立即绑定

比较 MM:SS 格式的两个时间

比较 MM:SS 格式的两个时间

森栏 2023-08-09 15:27:36
我希望以 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考虑到 MM:SS 格式,是否有任何其他方法可以让我获得预期的输出。
查看完整描述

4 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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


此方法将所有解析的默认时间设置为相同的值,这不会暴露其他任何"00:"地方,如果意外输入不同的时间,则可能容易出现错误。


这将确保任何Duration.between()分钟和秒都是准确的:


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);

}

输出:

-10

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

HH:mm
HH:mm:ss
HH:mm:ss.SSS
HH:mm:ss.SSSSSS
HH:mm:ss.SSSSSSSS


查看完整回答
反对 回复 2023-08-09
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

    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分钟。这是两个参数之间的时间差。


查看完整回答
反对 回复 2023-08-09
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您可能使用LocalTime方法不正确。


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


    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());

输出是:


-10


时间字符串被解析为时间 00:20:28 和 00:20:18。我不明白的是,将自己限制在晚上 00:00:00 到 01:00:00 之间的时间有什么意义。相反,如果您的时间相对于某个点(不一定是 00:00),那么使用Duration它们可能更正确。这个想法是,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,我使用正则表达式将字符串转换为这种格式。


输出与之前相同。


查看完整回答
反对 回复 2023-08-09
?
手掌心

TA贡献1942条经验 获得超3个赞

问题是你不能有一个只有分钟和秒的格式化程序,小时是强制性的。一种可能的方法是在字符串前面添加默认小时:


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


另一种可能的方法是使用of具有默认时间的方法:


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


查看完整回答
反对 回复 2023-08-09
  • 4 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信