Java 8中默认DateTimeFormatter格式化LocalDateTime返回空字符串问题
这不是Java Bug,是符合API设计逻辑的边缘场景
这个问题确实容易让人困惑——啥都没配置的格式化器,既不报错也不输出预期的日期,反而返回空字符串,换谁都会愣一下。不过放心,这不是Java的Bug,而是DateTimeFormatterBuilder设计逻辑里的预期行为,只是属于比较冷门的边缘场景而已。
为什么会返回空字符串?
DateTimeFormatterBuilder的核心作用是逐步组装日期时间的格式化规则:你通过appendPattern、appendValue等方法添加格式化组件,Builder再把这些组件拼接成完整的Formatter。如果你什么组件都没加,相当于构建了一个“无操作”的Formatter——它既不会读取日期时间的任何字段,自然也不会输出任何内容,所以格式化结果就是空字符串。
虽然Javadoc里没有专门针对“空Builder生成空输出”做明确说明,但从API的设计意图来看:Builder允许你灵活组合格式部件,没有部件的情况下,输出空是合理的逻辑——毕竟你没告诉它要输出什么内容。
怎么得到你预期的结果?
如果你想要默认格式的输出,或者自定义格式,有两种常见方式:
- 用默认ISO格式:直接使用
DateTimeFormatter.ISO_LOCAL_DATE_TIME(这也是LocalDateTime.parse()默认使用的解析格式),或者直接调用LocalDateTime.toString()方法,效果一致:LocalDateTime dt = LocalDateTime.parse("2018-01-01T00:00:00.00"); String defaultFormatted = dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); // 或者直接toString() String sameResult = dt.toString(); - 自定义格式:必须在
DateTimeFormatterBuilder中添加具体的格式规则,比如:DateTimeFormatter customFormatter = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm:ss.SS") .toFormatter(); String customFormatted = dt.format(customFormatter);
为什么不抛出异常?
Java的设计逻辑里并没有把“空Builder生成Formatter”视为错误:你确实遵循了Builder的API规范,合法构建了一个Formatter实例,只是这个实例的行为是“无输出”。如果想要触发异常,你需要显式地校验Formatter是否包含有效规则,或者确保在构建时至少添加一个格式化组件。
内容的提问来源于stack exchange,提问作者Michal Kordas
相关产品推荐
相关产品推荐

