tl;博士
其中秒和毫秒为 00000,这是解析器失败的时间
不,解析器成功。您的问题是生成字符串,而不是解析。
如文档所述,默认DateTimeFormatter
值以秒和小数秒为单位抑制零值。
功能,而不是错误
您的问题不在于解析,而在于解析后生成字符串。请记住,日期时间对象的文本表示是不同的并且与对象分开。换句话说,日期时间对象没有“格式”。
[字符串] --> parse
--> [本地日期时间] --> toString
--> [字符串]
的文档LocalDateTime::toString
清楚地表明,当在最不重要的部分遇到零值时,将使用最短的格式变化。去引用:
输出将是以下 ISO-8601 格式之一:
uuuu-MM-dd'T'HH:mm
uuuu-MM-dd'T'HH:mm:ss
uuuu-MM-dd'T'HH:mm:ss.SSS
uuuu-MM-dd'T'HH:mm:ss.SSSSSS
uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS
使用的格式将是最短的输出时间的完整值,其中省略的部分被暗示为零。
例子
关于YCF_L 接受的答案中显示的两个示例……</p>
20180301091600001 结果是 2018-03-01T09:16:00.001
在该示例中,最低有效部分(毫秒)具有非零值,因此它在结果中表示。
2018030100000000 结果是 2018-03-01T00:00
在该示例中,小时、分钟、秒、毫秒、微秒和纳秒的最低有效部分都为零。因此它们的显示被抑制,除了小时和分钟,因为文档承诺总是显示年分钟。
因此,您的两个示例都按记录工作;功能,而不是错误。
解决方案
解决方案是不使用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 ) ;
但请记住,您生成的字符串将抑制LocalDateTime
对象中任何微秒或纳秒的显示。