Java中yyyyMMddhhmmss格式字符串转Date报错求助
解决方案:处理无前置零的时间字符串转日期
咱们先搞清楚问题出在哪:你的输入字符串"201710164425"是12位,而你用的格式"yyyyMMddhhmmss"需要14位(4位年+2位月+2位日+2位时+2位分+2位秒)。解析时,程序会把第9、10位的44当成12小时制的小时数,这显然超出了hh允许的范围(1-12),所以直接抛出ParseException。而你加了一个0变成13位后,SimpleDateFormat的宽松模式(默认开启)会自动调整解析逻辑,但这种行为其实不可靠,咱们得用更严谨的方式处理。
下面给你两种靠谱的解决方案:
方案1:预处理字符串,补全到标准格式
如果你的输入固定是「8位日期+4位时间」的结构(时间是「1位小时+2位分钟+1位秒」),可以先把字符串补全为14位的标准格式,再用SimpleDateFormat解析:
public static void main(String[] args) throws ParseException { String sDate1 = "201710164425"; // 拆分日期和时间部分,补全小时和秒的前置零 String datePart = sDate1.substring(0, 8); String timePart = sDate1.substring(8); // 把1位小时补成2位,1位秒补成2位 String fixedTime = String.format("%02d%s%02d", Integer.parseInt(timePart.substring(0, 1)), timePart.substring(1, 3), Integer.parseInt(timePart.substring(3))); String formattedStr = datePart + fixedTime; Date date1 = new SimpleDateFormat("yyyyMMddhhmmss").parse(formattedStr); System.out.println(sDate1 + "\t" + date1); }
这样处理后,"201710164425"会变成"20171016044205",完全符合格式要求,解析结果就是你期望的Mon Oct 16 04:42:05 IST 2017。
方案2:使用Java 8+的新日期时间API(推荐)
SimpleDateFormat是线程不安全的,而且宽松模式的行为容易出问题,Java 8引入的java.time包是更优选择。我们可以用更清晰的逻辑处理字符串,再用DateTimeFormatter解析:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public static void main(String[] args) { String sDate1 = "201710164425"; // 预处理补全格式 String datePart = sDate1.substring(0, 8); String timePart = sDate1.substring(8); String fixedTime = String.format("%02d%s%02d", Integer.parseInt(timePart.substring(0, 1)), timePart.substring(1, 3), Integer.parseInt(timePart.substring(3))); String formattedStr = datePart + fixedTime; // 用24小时制的话把hh改成HH,避免12小时制的歧义 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddhhmmss"); LocalDateTime dateTime = LocalDateTime.parse(formattedStr, formatter); System.out.println(sDate1 + "\t" + dateTime); }
如果你的输入时间的小时可能是1位或2位(比如有时候是14425对应14:42:05),还可以加个判断逻辑动态补零,灵活性更高。
最后提醒:如果业务场景允许,尽量用HH(24小时制)代替hh(12小时制),避免AM/PM的歧义导致解析错误。
内容的提问来源于stack exchange,提问作者Lokeshkumar R




