hourOfDay的值24必须在[0,23]范围内

时间:2020-09-22 08:24:11

标签: java android time java-time localtime

我在我的Android应用中使用了REST服务,该服务仅给我时间,但它还会返回类似的信息

"24:38:00""25:15:00"

所以,我需要这次解析,然后以24h格式输出真实结果。应该是

"00:38:00""01:15:00"

我尝试过使用这种方式

LocalTime localTime = new LocalTime(timeModel.getTimeString());

但是我现在有此错误Cannot parse "24:38:00": Value 24 for hourOfDay must be in the range [0,23]

我该如何解决?我只需要时间,不需要日期

4 个答案:

答案 0 :(得分:4)

您可以拆分时间字符串并获取小时,分钟,秒,然后使用 ./bin/console doctrine:migrations:migrate

LocalTime.of

答案 1 :(得分:1)

您应该真正修复此服务器。如果这是不可能的,则您必须使用类似的方法来解决该错误

String fixServerTime(String time) {
  if (time.startsWith("24")) {
    return "00" + time.substring(2)
  } else {
    return time
  }
)

// elsewhere
LocalTime localTime = new LocalTime(fixServerTime(timeModel.getTimeString()));

答案 2 :(得分:1)

在这种情况下,您可以假设这些时间字符串不遵循任何规则,因为如果2425作为“小时”部分的值存在,为什么它们不回复{ {1}}?

您可以使用它来清理:

37

呼叫private static String modifyTimeString(String s) { //the hour might only be 1 digit, so "the first 2 chars" is not a safe approach int colonIndex = s.indexOf(':'); String hoursString = s.substring(0, colonIndex); Integer hours = Integer.valueOf(hoursString); if(hours < 24) { return s; } /*while(hours >= 24) { hours -= 24; }*/ //smarter, see ronos answer: hours = hours % 24; //put a leading 0 in there for single-digit-hours hoursString = hours.toString(); if(hours<10) { hoursString = "0" + hoursString; } return hoursString + s.substring(colonIndex); } 返回modifyTimeString("25:15:00")

答案 3 :(得分:1)

使用宽大的解析器

您需要的是用于解析的有效格式化程序,或更准确地说,是具有宽松解析器样式的格式化程序(格式化程序也具有解析样式,因此您无需宽大处理)。

    DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_LOCAL_TIME
            .withResolverStyle(ResolverStyle.LENIENT);
    String timeString = "25:15:00";
    
    LocalTime time = LocalTime.parse(timeString, timeFormatter);
    System.out.println(time);

输出:

01:15

您不需要任何手动解析,if语句或任何模运算。您无需处理任何特殊情况。您可以将所有内容留给标准库。对于可读性和对代码的信任都很好。