我知道DateTimeFormatter有两个用于格式化日期的实现。
-
模式格式(日期)
-
日期格式(模式)
public static void main(String[] args) { DateTimeFormatter pattern = DateTimeFormatter.ofPattern("MM/dd/yyyy"); LocalDate date = LocalDate.now(); String dateFormatText = date.format(pattern); String patternFormatText = pattern.format(date); System.out.println(dateFormatText); System.out.println(patternFormatText); }
两个系统输出打印相同的值。
Oracle 文档示例使用 Date.format 方法,而我可以看到许多使用 Pattern.format 方法的技术博客。
谁能解释一下有什么区别,哪个最好使用?
源代码演示 : 这里
虽然是基于意见的,但我会尝试一个答案。
正如Stephen C已经记录的那样,这两种形式是等价的。
哪个最好?正如编程中经常出现的那样,答案是:最好写出对那些阅读你的代码的人来说最不令人惊讶的东西。
那么,什么最不令人惊讶呢?我相信答案各不相同。你的组织会——有意识地或无意识地——为你正在做的事情建立一个传统,最不令人惊讶的是遵循这个传统。
每个选项的要点
我还想看看为什么这两个选项都潜入java.time的一些可以思考的原因。这可能会让我们进一步思考其中一种的优点。
而且由于我不做读心术,所以这是猜测。我认为date.format(formatter)
的形式至少受到两个方面的启发:
- 它与
date.toString()
并行,在 java.time 中,我们也经常使用它将日期时间对象格式化为字符串。在 java.time 的前身 Joda-Time 中,我们甚至有相同的方法名称:date.toString(formatter)
。 - 它以某种方式与
DateType.parse(string, formatter)
并行,这是我们用于相反操作的,将字符串转换为日期时间对象。例如LocalDate.parse("08/04/2021", pattern)
.这种形式反过来在java.time的设计中是必要的。formatter.parse(string)
不知道是解析为LocalDate
、Instant
、ZonedDateTime
还是Java.time的许多其他日期时间类型之一。(不过,pattern.parse("08/04/2021", LocalDate::from)
形式作为替代形式存在,有时是必要的,但不经常使用。
我可能错过了一些东西,但许多技术博客使用formatter.format(date)
的一个原因是灵感来自现在过时的SimpleDateFormat
,该一直使用format.format(date)
.我无法完全逃避这样的想法:也许那些博主还没有完全进入java.time的思维方式。
谁能解释一下我有什么区别?
没有显著差异。
LocalDateTime.format
的javadoc 说:
public String format(DateTimeFormatter formatter)
使用指定的格式化程序设置此日期时间的格式。
此日期时间将传递给格式化程序以生成字符串。
换句话说,LocalDateTime.format
调用DateTimeFormatter.format
。
...哪个最好用?
两者都不是"最好的"。
由您决定哪种形式更清楚地表达您的意图。 你想说:
- "
LocalDateTime
:使用此格式化程序格式化自己",或 - "
DateTimeFormatter
:格式化此时间值"。