Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hourOfDay的值24必须在[0,23]范围内_Java_Android_Time_Java Time_Localtime - Fatal编程技术网

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

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]范围内

我在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]范围内


我怎样才能解决这个问题?我只需要时间而不是日期

您应该真正修复此服务器。如果这是不可能的,那么您必须使用类似

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);