Java 以MM:SS格式比较两次
我希望用MM:SS格式比较两次,并在几秒钟内得到这两次之间的差异 例如 时间1=20:28 ,时间2=20:18 差是-10秒 我试着用下面的方法来比较时间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 );
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
。但这也行不通