将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
相关产品推荐
相关产品推荐

