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

Value 24 for hourOfDay must be in the range [0,23]

我在我的 Android 应用程序中使用了一个 REST 服务,它给我时间,只有时间,但它 returns 也像

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

所以,我这次需要的是解析并以24小时格式输出一个真实的结果。应该是

"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]

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

你真的应该修好这个服务器。如果这是不可能的,你将不得不使用类似

的方法来解决这个错误
String fixServerTime(String time) {
  if (time.startsWith("24")) {
    return "00" + time.substring(2)
  } else {
    return time
  }
)

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

在这种情况下,您可以假设这些时间字符串不遵循任何规则,因为如果 2425 作为“小时”部分的值存在,他们为什么不回复用 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") returns "01:15:00"

您可以拆分时间字符串并获取小时、分钟、秒,然后使用 LocalTime.of

String timeData = "25:15:00";
String[] timeParts = timeData.split(":");
LocalTime localTime = LocalTime.of(Integer.parseInt(timeParts[0]) % 24,
                                   Integer.parseInt(timeParts[1]), 
                                   Integer.parseInt(timeParts[2]));

使用宽松的解析器

您需要的是一个用于解析的宽松格式化程序——或者更准确地说,一个具有宽松解析器样式的格式化程序(格式化程序也具有解析样式,在您的情况下不需要宽松)。

    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 语句,也不需要任何模运算。您不需要处理任何特殊情况。您可以将其全部留给标准库。这对于可读性和对代码的信任都有好处。