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()));
在这种情况下,您可以假设这些时间字符串不遵循任何规则,因为如果 24
和 25
作为“小时”部分的值存在,他们为什么不回复用 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
语句,也不需要任何模运算。您不需要处理任何特殊情况。您可以将其全部留给标准库。这对于可读性和对代码的信任都有好处。
我在我的 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()));
在这种情况下,您可以假设这些时间字符串不遵循任何规则,因为如果 24
和 25
作为“小时”部分的值存在,他们为什么不回复用 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
语句,也不需要任何模运算。您不需要处理任何特殊情况。您可以将其全部留给标准库。这对于可读性和对代码的信任都有好处。