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

将dd/mm/yyyy格式字符串转Timestamp时抛出ParseException求助

解析日期字符串抛出ParseException的原因及解决方案

让我来帮你排查这个问题,大概率是以下几个原因导致的异常:

最可能的原因:Locale导致的日期分隔符不匹配

你用的SimpleDateFormat("dd/MM/yyyy")里的/不是普通的斜杠——它是一个特殊占位符,代表当前系统Locale(区域设置)的默认日期分隔符。比如有些地区的Locale会用.或-作为日期分隔符,但你生成日期字符串的时候是硬编码用/连接的(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year),这时候解析器会用系统默认的分隔符去匹配字符串里的/,自然就匹配失败抛出异常了。

第二个可能:eventDate1的内容不符合预期

如果你的解析逻辑在用户还没选择日期就触发了(比如页面初始化时就执行),那eventDate1可能是空字符串或者txtDate的默认提示文本,这种无效内容也会导致解析失败。


对应的解决方案:

方案1:把斜杠转为字面量处理

修改SimpleDateFormat的格式串,用单引号把/括起来,让解析器把它当作普通字符,不受Locale影响:

SimpleDateFormat formatter = new SimpleDateFormat("dd'/'MM'/'yyyy");
try {
    Date date = formatter.parse(eventDate1);
    timestamp = date.getTime(); // 直接获取毫秒级时间戳,不用多余的转字符串再转数字
} catch (ParseException e) {
    e.printStackTrace();
    // 这里可以添加用户提示,比如"日期格式错误"
}

方案2:指定固定Locale创建SimpleDateFormat

如果你不想改格式串,可以在创建SimpleDateFormat时指定一个以/为日期分隔符的Locale(比如Locale.US):

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Locale.US);

方案3:用Java 8+的DateTimeAPI(推荐)

SimpleDateFormat是线程不安全的,而且API比较老旧,推荐使用java.time包下的现代日期类来处理:

// 定义格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
try {
    LocalDate localDate = LocalDate.parse(eventDate1, formatter);
    // 转换为毫秒级时间戳(需指定时区,这里用系统默认时区)
    timestamp = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
} catch (DateTimeParseException e) {
    e.printStackTrace();
}

另外,还要确保你的解析逻辑是在用户选择完日期之后才执行的,比如把解析代码放在onDateSet方法里,或者用户点击确认按钮后再获取eventDate1,避免拿到无效的空值或错误内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:22