You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动