java.time.format.DateTimeParseException仅在2位数的毫秒数

问题描述 投票:1回答:3

我正在使用java8格式化程序解析像'2018-04-12 15:12:32.999'这样的日期。当我有一个3位数毫秒,例如这个日期'2018-04-12 15:12:32.999',它工作正常,但它失败并抛出异常java.time.format.DateTimeParseException: Text '2018-04-18 15:27:10.77' could not be parsed at index 20,当日期只有2位数毫秒时,你能建议如何解析这个日期。

我的格式化程序正在使用“yyyy-MM-dd HH:mm:ss.SSS"模式。我的代码是这样的:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime.parse(dateStr,formatter);
java java-time datetime-parsing java-date
3个回答
1
投票

有几种选择。我会选择这个:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();
    String dateTimeString = "2018-04-18 15:27:10.77";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

输出:

2018-04-18T15:27:10.770

DateTimeFormatter.ISO_LOCAL_TIME可选择接受小数点和1到9位数。我更喜欢使用构建器来组合预定义的格式化程序,而不是从头构建我自己的格式化程序

有些人更喜欢较短的一个。就个人而言,我发现它有点hacky:

    dateTimeString = dateTimeString.replace(' ', 'T');
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString);

输出是一样的。我们正在利用两个事实:(1)one-arg LocalDateTime.parse解析ISO 8601格式。 (2)您的输入字符串非常接近ISO 8601格式,它只缺少表示时间部分开始的地方的T

您不需要第三个选项,但为了完整起见,我想提一下:如果从头开始构建格式化程序并需要可变数量的小数,请使用DateTimeFormatterBuilder(我在第一个代码段中使用的类)和its appendFraction method。它可以控制最小和最大小数位数。


1
投票
String dateStr = "2018-04-12 15:12:32.99";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("yyyy-MM-dd HH:mm:ss")
            .appendFraction(ChronoField.NANO_OF_SECOND, 2, 3, true)
            .toFormatter();
System.out.println(LocalDateTime.parse(dateStr, formatter));

其中2,3 - 场的最小宽度

输出:

2018-04-12T15:12:32.990


0
投票

15:12:32:999包含结肠:。你的模式HH:mm:ss.SSS包含一个点.这将不匹配。

这有效。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Playground {

    public static void main(String[] args) throws ParseException {
        String pattern = "yyyy-MM-dd HH:mm:ss.SSS";

        String s1 = "2018-04-12 15:12:32.999";
        String s2 = "2018-04-18 15:27:10.77";

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);

        Date d1 = sdf.parse(s1);
        System.out.println(d1);

        Date d2 = sdf.parse(s2);
        System.out.println(d2);
    }

}

输出:

Thu Apr 12 15:12:32 CEST 2018
Wed Apr 18 15:27:10 CEST 2018
© www.soinside.com 2019 - 2024. All rights reserved.