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



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

  1. 模式格式(日期)

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

两个系统输出打印相同的值。

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

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

源代码演示 : 这里

虽然是基于意见的,但我会尝试一个答案。

正如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的思维方式。

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

没有显著差异。

LocalDateTime.format的javadoc 说:

public String format(DateTimeFormatter formatter)

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

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

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

<小时 />

...哪个最好用?

两者都不是"最好的"。

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

  • "LocalDateTime:使用此格式化程序格式化自己",或
  • "DateTimeFormatter:格式化此时间值"。

最新更新