0

我知道 DateTimeFormatter 有两个用于格式化日期的实现。

  1. Pattern.format(日期)

  2. 日期格式(模式)

    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);
    }
    
    

两个 SysOut 打印相同的值。

Oracle 文档示例使用 Date.format 方法,而我可以看到许多技术博客使用 Pattern.format 方法。

谁能解释一下有什么区别,哪个最好用?

源代码演示:这里

4

2 回答 2

2

虽然基于意见我会尝试一个答案。

正如 Stephen C 已经记录的那样,这两种形式是等价的。

哪个最好?在编程中,答案常常是:最好写出那些阅读您的代码的人最不会感到惊讶的东西。

那么最不令人惊讶的是什么?我相信答案会有所不同。你的组织会有意或无意地为你所做的事情建立一个传统,最不令人惊讶的是遵循这个传统。

每个选项的点

我还想看一下为什么这两个选项都悄悄进入 java.time 的一些可想而知的原因。这可能会让我们对其中一个或另一个的优点有一些进一步的想法。

因为我不读心术,所以这是猜测。我认为这种形式date.format(formatter)的形成至少有两个方面的灵感:

  1. 它与 平行date.toString(),我们也经常使用 java.time 将日期时间对象格式化为字符串。在 java.time 的前身 Joda-Time 中,我们甚至有相同的方法名:date.toString(formatter).
  2. 它在某种程度上平行于DateType.parse(string, formatter),这是我们用于相反操作的,将字符串转换为日期时间对象。例如LocalDate.parse("08/04/2021", pattern). 这种形式反过来又是 java.time 设计所必需的。formatter.parse(string)不知道是否解析为 a LocalDate、 an Instant、 aZonedDateTime或 java.time 的许多其他日期时间类型之一。(pattern.parse("08/04/2021", LocalDate::from)不过,该形式作为替代形式存在,有时是必要的,但不经常使用。)

而且我可能遗漏了一些东西,但许多科技博客使用的一个原因formatter.format(date)是从现在已经过时SimpleDateFormat的一贯使用的format.format(date). 我无法完全摆脱那些博主可能还没有完全进入 java.time 思维方式的想法。

于 2021-08-04T04:48:20.983 回答
1

谁能解释一下有什么区别?

没有显着差异。

javadocLocalDateTime.format说:_

public String format(DateTimeFormatter formatter)

使用指定的格式化程序格式化此日期时间。

此日期时间将传递给格式化程序以生成字符串。

换句话说,LocalDateTime.format调用DateTimeFormatter.format.


...哪个最好用?

两者都不是“最好的”。

由您决定哪种形式更清楚地表达您的意图。你想说:

  • " LocalDateTime: 用这个格式化程序格式化自己",或者
  • DateTimeFormatter:格式化这个时间值”。
于 2021-08-04T02:02:46.540 回答