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
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分钟。这是两个参数之间的时间差。
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,我使用正则表达式将字符串转换为这种格式。
输出与之前相同。
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
添加回答
举报