V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leeyuzhe
V2EX  ›  Java

LocalDateTime.parse 无法解析秒跟毫秒连在一起的字符串是什么原因?

  •  
  •   leeyuzhe · 2022-06-07 11:39:45 +08:00 · 1772 次点击
    这是一个创建于 900 天前的主题,其中的信息可能已经有所发展或是发生改变。
    String timeString = "20220601132050399";
    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    LocalDateTime.parse(timeString,format);
    

    这样就报错“java.time.format.DateTimeParseException: Text '20220601132050399' could not be parsed at index 0”。 但是如果随便什么东西把毫秒跟秒隔开就没问题比如:

    20220601132050:399 yyyyMMddHHmmss:SSS
    20220601132050 399 yyyyMMddHHmmss SSS
    

    就都没问题。请问这是啥原因?

    另外正向 format 是没问题的。

    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    LocalDateTime.now().format(format);
    
    5 条回复    2022-06-07 13:29:27 +08:00
    aguesuka
        1
    aguesuka  
       2022-06-07 12:02:55 +08:00
    jdk11 和 17 分别测试了第一段代码, 没有复现
    chendy
        2
    chendy  
       2022-06-07 12:10:01 +08:00
    java8 复现,17 无法复现
    目测是个 bug……
    zhzy0077
        3
    zhzy0077  
       2022-06-07 12:26:36 +08:00
    https://bugs.openjdk.org/browse/JDK-8031085

    不出意外是这个 里面有几个 workaround 楼主可以试试看
    yazinnnn
        4
    yazinnnn  
       2022-06-07 12:45:23 +08:00
    https://blog.csdn.net/kuailebuzhidao/article/details/118465230

    csdn 还是有内容的

    ---------

    根据上述分析,只要让代码可以明确知道固定子序列宽度是 10 ,毫秒可变序列宽度是 3 即可。官方提供的方法是单独拼接毫秒并指定宽度。

    public class TestDate {
    public static void main(String[] args) {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss")
    .appendValue(ChronoField.MILLI_OF_SECOND, 3).toFormatter();

    LocalDateTime datetime = LocalDateTime.parse("20210601140102123", formatter);
    System.out.println(datetime);

    String formatTime = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
    System.out.println(formatTime);
    }
    }
    leeyuzhe
        5
    leeyuzhe  
    OP
       2022-06-07 13:29:27 +08:00
    @aguesuka @chendy @zhzy0077 @yazinnnn 感谢各位,确实是 jdk8 的问题,已采用显示的指示毫秒长度来解决。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1184 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:31 · PVG 02:31 · LAX 10:31 · JFK 13:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.