首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当毫秒为2位数字时为java.time.format.DateTimeParseException

仅当毫秒为2位数字时为java.time.format.DateTimeParseException
EN

Stack Overflow用户
提问于 2018-04-18 22:21:16
回答 3查看 1.4K关注 0票数 1

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

我的格式化工具使用的是"yyyy-MM-dd HH:mm:ss.SSS"模式“。我的代码如下:

代码语言:javascript
复制
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime.parse(dateStr,formatter);
EN

回答 3

Stack Overflow用户

发布于 2019-01-28 19:07:08

代码语言:javascript
复制
String dateStr = "2018-04-12 15:12:32.99";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("yyyy-MM-dd HH:mm:ss")
            .appendFraction(ChronoField.MILLI_OF_SECOND, 2, 3, true)
            .toFormatter();
System.out.println(LocalDateTime.parse(dateStr, formatter));

其中,2,3 -字段的最小宽度和最大宽度

输出:

2018-04-12T15:12:32.990

票数 2
EN

Stack Overflow用户

发布于 2018-04-19 11:04:16

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

代码语言:javascript
复制
    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可以选择接受小数点和一到九位数字。我更喜欢使用构建器来组合预定义的格式化程序,而不是从头开始构建自己的格式化程序。

有些人更喜欢短一点的。就我个人而言,我觉得这有点老生常谈:

代码语言:javascript
复制
    dateTimeString = dateTimeString.replace(' ', 'T');
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString);

输出是相同的。我们利用了两个事实:(1)单参数LocalDateTime.parse解析ISO8601格式。(2)您的输入字符串非常接近ISO8601格式,只是缺少表示时间部分开始位置的T

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

票数 1
EN

Stack Overflow用户

发布于 2018-04-18 22:34:26

15:12:32:999包含冒号:。您的pattern HH:mm:ss.SSS包含一个不匹配的点.

这是可行的。

代码语言:javascript
复制
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);
    }

}

输出:

代码语言:javascript
复制
Thu Apr 12 15:12:32 CEST 2018
Wed Apr 18 15:27:10 CEST 2018
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49902174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档