Web服务时间字符串相减报错:日期解析失败问题排查
问题分析与解决方案
从你的异常信息Unparseable date: "10:00"可以直接定位核心问题:你定义的日期解析格式和实际传入的时间字符串不匹配。
你当前用的解析格式是:
String hourf = "HH:mm:ss 'Z'";
这个格式要求输入的时间必须是HH:mm:ss Z的形式(比如10:00:00 Z),但实际传入的参数是10:00——既没有秒数部分,也没有末尾的Z标识,所以解析时直接抛出了ParseException。
另外,你的时间差计算逻辑也存在漏洞:如果Hora_out晚于Hora_in,Hin.getTime() - Hout.getTime()会得到负数,直接用这个负数创建Date对象会得到1970-01-01之前的日期,这显然不是你想要的"时间差"结果。
修复后的完整代码
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.ejb.Stateless; @WebService(serviceName = "Parking") @Stateless() public class Parking { @WebMethod(operationName = "Reserva") public String Reserva(@WebParam(name = "Hora_in") String Hora_in, @WebParam(name = "Hora_out") String Hora_out) throws ParseException { // 匹配输入的"HH:mm"格式 Locale locale = new Locale("es","CO"); String hourFormat = "HH:mm"; SimpleDateFormat format = new SimpleDateFormat(hourFormat, locale); format.setTimeZone(TimeZone.getTimeZone("GMT")); Date hin = format.parse(Hora_in); Date hout = format.parse(Hora_out); // 计算时间差(取绝对值,确保结果为正) long diffMillis = Math.abs(hout.getTime() - hin.getTime()); // 将毫秒数转换为HH:mm:ss格式的时间间隔 long totalSeconds = diffMillis / 1000; long hours = totalSeconds / 3600; long remainingMinutes = (totalSeconds % 3600) / 60; long remainingSeconds = totalSeconds % 60; String parqueo = String.format("%02d:%02d:%02d", hours, remainingMinutes, remainingSeconds); return parqueo; } }
关键改动说明
- 格式匹配:把解析格式改成
"HH:mm",完全适配传入的10:00这类时间字符串。如果后续可能有带秒的输入(比如10:00:30),可以改用"HH:mm[:ss]"(Java 7及以上版本支持可选格式部分)。 - 时间差计算:
- 用
Math.abs()确保时间差为正数,避免负数导致的异常日期。 - 直接通过毫秒数计算小时、分钟、秒,而非用
Date对象包装,这样得到的是真实的时间间隔,而非某个历史日期。
- 用
- 结果格式化:用
String.format()将计算出的时分秒格式化为标准的HH:mm:ss字符串,输出更规范。
内容的提问来源于stack exchange,提问作者ives rodriguez
相关产品推荐
相关产品推荐

