Java hourOfDay的值24必须在[0,23]范围内
我在Android应用程序中使用了一个REST服务,它给我一个时间,只给我一个时间,但它也会返回类似的值Java hourOfDay的值24必须在[0,23]范围内,java,android,time,java-time,localtime,Java,Android,Time,Java Time,Localtime,我在Android应用程序中使用了一个REST服务,它给我一个时间,只给我一个时间,但它也会返回类似的值 “24:38:00”或“25:15:00” 所以,我需要的是这次解析并以24小时格式输出一个真正的结果。应该是 “00:38:00”和“01:15:00” 我试着用这种方法 LocalTime LocalTime=newlocaltime(timeModel.getTimeString()) 但是我现在有这个错误无法解析“24:38:00”:hourOfDay的值24必须在[0,23]范围内
“24:38:00”
或“25:15:00”
所以,我需要的是这次解析并以24小时格式输出一个真正的结果。应该是
“00:38:00”
和“01:15:00”
我试着用这种方法
LocalTime LocalTime=newlocaltime(timeModel.getTimeString())代码>
但是我现在有这个错误无法解析“24:38:00”:hourOfDay的值24必须在[0,23]范围内
我怎样才能解决这个问题?我只需要时间而不是日期您应该真正修复此服务器。如果这是不可能的,那么您必须使用类似
String fixServerTime(字符串时间){
如果(时间开始,以“24”开头){
返回“00”+时间。子字符串(2)
}否则{
返回时间
}
)
//别处
LocalTime LocalTime=newlocaltime(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(字符串s){
//小时可能只有1位数,所以“前2个字符”不是一种安全的方法
int colonIndex=s.indexOf(“:”);
字符串hoursString=s.substring(0,克隆索引);
整数小时=整数.valueOf(hoursString);
如果(小时<24小时){
返回s;
}
/*而(小时>=24){
小时-=24小时;
}*/
//更聪明,请参见ronos回答:
小时数=小时数%24;
//将前导0放在那里,表示一位数的小时数
hourString=hours.toString();
if(hours您可以拆分时间字符串并获取小时、分钟、秒,然后使用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]));
使用宽松的解析器
您需要的是一个用于解析的宽松格式化程序,或者更准确地说,是一个具有宽松解析器样式的格式化程序(格式化程序也有解析样式,在您的情况下不需要宽松)
输出:
01:15
你不需要任何手工解析,也不需要任何if
语句,也不需要任何模运算。你不需要处理任何特殊情况。你可以把它们全部留给标准库。这对代码的可读性和可靠性都很好。怎么样..如果小时数>=24,从中减去24?你认为这是最好的方法吗?你能告诉我你的意思吗?hourOfDay%24
?有时候这样的时间是有原因的。据我所知,日本的深夜电视节目表是24点之后的,所以他们说的不是“周三凌晨3点”,而是“周二27点”。这个答案不适用于25+的小时数,但OP可能会接受这个想法并对其进行一些调整。好的,ISO标准只允许0-23,java.time API基于该标准,因此要在这种“定制”环境中成功使用它们,就必须“破解”:我真的不相信输入值总是给你2位数的“小时”部分…当他们滥用小时时,为什么他们不滥用分钟和秒呢?当你同时使用%60
分钟和秒时,这可能是最健壮的。我尝试了这个,它工作得很好。当然,服务器有问题。但我无法解决。这个方法是一个很好的解决方法。谢谢!这是本页所有答案中最好的!
DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_LOCAL_TIME
.withResolverStyle(ResolverStyle.LENIENT);
String timeString = "25:15:00";
LocalTime time = LocalTime.parse(timeString, timeFormatter);
System.out.println(time);