You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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及以上版本支持可选格式部分)。
  • 时间差计算:
    1. 用Math.abs()确保时间差为正数,避免负数导致的异常日期。
    2. 直接通过毫秒数计算小时、分钟、秒,而非用Date对象包装,这样得到的是真实的时间间隔,而非某个历史日期。
  • 结果格式化:用String.format()将计算出的时分秒格式化为标准的HH:mm:ss字符串,输出更规范。

内容的提问来源于stack exchange,提问作者ives rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:57:42