当前位置: 首页 > 知识库问答 >
问题:

Java:DateTimeFormatter在秒和毫秒都为0时无法解析时间字符串?

任元青
2023-03-14

基本上,我使用下面的代码将string解析为LocalDateTime,这在大多数情况下都很好。

DateTimeFormatter dtformatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

然而,我遇到过秒数和毫秒数00000的情况,这是解析器失败并打印2018-03-01T09:16而不是2018-03-01T09:16:00.000的情况。

System.out.println(LocalDateTime.parse("20180301091600000",dtformatter));

(注意,在我的代码中,我必须将字符串解析为< code>LocalDateTime,进行一些比较,然后在最后将< code>LocalDateTime打印为csv)

如何修复它以使其打印2018-03-01T09:16:00.000而不是2018-03-01T09:16

仅供参考,我正在使用jdk10。

共有2个答案

马宜民
2023-03-14

我不知道为什么它不起作用, 它似乎是一个错误,因为 当我使用时:

20180301091600001        result is      2018-03-01T09:16:00.001
----------------^                       -----------------^^^^^^

还有另一个测试:

2018030100000000         result is      2018-03-01T00:00
--------^^^-----                        -----------^^^^^^^^^^^

好像解析器在为零的时候忽略秒和毫秒,为什么?

完整的解释为什么?,是在巴兹尔·布尔克的回答中。

这是一个快速修复,您可以在其中使用另一个这样的格式化程序:

var result = LocalDateTime.parse("20180301091600000", dtformatter)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss:SSS"));

输出

2018-03-01T09:16:00:000
安星汉
2023-03-14

其中秒和毫秒为00000,此时解析器失败

否,解析器成功。你的问题是生成一个字符串,而不是解析。

默认的< code>DateTimeFormatter取消了以秒和小数秒为单位的零值,正如所记录的那样。

问题不在于解析,而在于解析后字符串的生成。请记住,日期时间对象的文本表示是不同的,并且与对象是分开的。换句话说,日期时间对象没有“格式”。

[字符串]--

LocalDateTime::toString的留档清楚地表明,当在最低有效部分遇到零值时,将使用尽可能短的格式变化。引用:

输出将是以下ISO-8601格式之一:

uuu MM dd'T'HH:MM

uuu MM dd’T'HH:MM:ss

UUUU-MM-dd'T'HH: mm:ss.SSS

uuuu-MM-dd'T'HH:mm:ss。自我介绍

uuu MM dd’T'HH:MM:ss.SSSSSSS(uuu MM-dd’T'H小时:毫米:秒)

使用的格式将是最短的,输出省略部分被暗示为零的时间的完整值。

关于YCF_L接受的答案中显示的两个例子...

20180301091600001结果是 2018-03-01T09:16:00.001

在该示例中,最低有效部分(毫秒)具有非零值,因此它在结果中表示。

2018030100000000结果是2018-03-01T00:00

在该示例中,小时、分钟、秒、毫秒、微秒和纳秒的最低有效部分均为零。因此,它们的显示被抑制,除了小时和分钟,因为文档promise始终显示年分钟。

因此,您的两个示例都按文档记录工作;功能,而不是错误。

解决方案是不使用toString方法中提供的默认格式化程序。相反,请使用另一个格式化程序。例如,使用为解析定义的相同自定义格式化程序。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyyMMddHHmmssSSS" );
LocalDateTime ldt = LocalDateTime.parse( "20180301091600000" , f );

String outputDefault = ldt.toString();
String outputCustom = ldt.format( f );

转储到控制台。

System.out.println( "outputDefault: " + outputDefault );
System.out.println( "outputCustom: " + outputCustom );

输出默认值:2018-03-01T09:16

输出自定义:20180301091600000

问题问:

我如何修复它以使其打印2018-03-01T09:16:00.000而不是2018-03-01T09:16?

指定自定义格式化程序,而不是默认格式化程序。

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss:SSS") ; 
String output = ldt.format( f ) ;

但请记住,您生成的String将禁止在LocalDateTime对象中显示任何微秒或纳秒。

 类似资料:
  • 问题内容: 基本上,我使用下面的代码将字符串解析为LocalDateTime,在大多数情况下都可以正常工作。 但是,我遇到的情况是秒和毫秒00000,这是解析器失败并打印LocalDateTime 2018-03-01T09:16而不是的情况2018-03-01T09:16:00.000。 (请注意,在我的代码中,我必须将string解析为LocalDateTime,进行一些比较,然后最后输出Lo

  • 问题内容: 我需要将持续时间字符串解析为毫秒形式。 我希望像这样的持续时间相等,但是我什么也找不到。有人会建议为此目的使用或支持SDF吗? 我目前的计划是使用正则表达式来匹配数字并做类似的事情 然后使用TimeUnit将它们放在一起并转换为毫秒。 我想我的问题是,这似乎有点过头了,它可以轻松完成吗?出现了很多有关日期和时间戳的问题,但这也许有些不同。 问题答案: 使用a 是一种合理的方法。但是,为

  • 问题内容: 这是我的代码: 是否可以在日期格式中添加毫秒和纳秒? 问题答案: 您可以通过在末尾添加来添加毫秒数,例如格式为。 毫微秒内没有参考。通常用于性能调试,而不用于显示目的。

  • 我从GPS接收机接收到一个时间戳,它以秒后的微秒时间表示:

  • 两个时间戳的示例 困难的部分原因是我认为没有类似的包来处理它。我不确定是否需要使用正则表达式来提取秒,然后将纳秒转换为毫秒。我愿意接受任何建议。 另外,您建议如何处理?我想我应该使用,然后像这样的包可以解析时间戳,甚至可以达到纳秒级的精度?

  • < b >想改进这个问题?通过编辑此帖子更新问题,使其只关注一个问题。 好的,我有以下场景:如果我有一个字符串,例如5d6m9s,我如何让Java将其识别为5天6分9秒,然后将其添加到当前毫秒以获得5天6分9秒的毫秒。底色是最好的方法吗? 我不擅长解释,所以这里简化了:5d6m9s- 5d6m9s只是一个例子,字符串可以是2w9h4m或3h7m。 提前感谢。