Pattern.format(日期)与 Date.fomat(模式)?

Pattern.format(date) vs Date.fomat(Pattern)?

我了解到 DateTimeFormatter 有两个格式化日期的实现。

  1. Pattern.format(日期)

  2. Date.format(模式)

    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 方法。

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

源代码演示:Here

Can anyone explain me what is the difference?

没有显着差异。

LocalDateTime.formatjavadoc 说:

public String format(DateTimeFormatter formatter)

Formats this date-time using the specified formatter.

This date-time will be passed to the formatter to produce a string.

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


... and which is best to use?

两者都不是“最佳”。

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

  • "LocalDateTime: 用这个格式化程序格式化你自己",或者
  • "DateTimeFormatter: 格式化这个时间值".

尽管基于意见我会尝试回答。

正如 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) 不知道是要解析为 LocalDateInstantZonedDateTime 还是 java.time 的许多其他日期时间类型之一。 (不过,pattern.parse("08/04/2021", LocalDate::from) 形式作为替代形式存在,有时是必要的,但不经常使用。)

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