java.time 是否为 "yyyy-MM-dd"、"HH:mm:ss" 或类似变体等模式带来默认的 DateTimeFormatters?

Does java.time bring default DateTimeFormatters for patterns such as "yyyy-MM-dd", "HH:mm:ss" or similar variants?

我发现自己一遍又一遍地重复相同的代码模式。我正在使用某种日期/时间对象 (Java 8 API),我最终不得不推出自己的 DateTimeFormatter:

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
DateTimeFormatter.ofPattern("yyyy-MM-dd")
DateTimeFormatter.ofPattern("HH:mm:ss")

这很好,但是..这让我想知道是否没有已经为我完成的预制的?我看了一眼 DateTimeFormatter 单例中提供的那些,但它们似乎没有太大帮助。

我觉得DateTimeFormatterdocumentation已经很清楚了。您提到的具体模式由以下预定义常量支持:

yyyy-MM-dd => ISO_LOCAL_DATE

HH:mm:ss => ISO_LOCAL_TIME

只有您的第一个示例 "yyyy-MM-dd HH:mm:ss" 与任何预定义的格式化程序都不匹配,因此您可以通过指定模式简单地构造它(正如您已经完成的那样)。 ISO_LOCAL_DATE_TIME 非常相似,但将 space 替换为 ISO 文字 "T"。

yyyy-MM-dd HH:mm:ss: assemble 来自内置部件

作为 Meno Hochschild 的好答案的补充。

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")

虽然不是内置的(即使经常出现),但我更喜欢从另一个答案中提到的两个预定义格式化程序中组装它,而不是编写我自己的格式模式字符串:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();

ISO_LOCAL_TIME 接受并打印 HH:mm:ss 以外的其他格式。一方面,它接受没有任何秒数的格式 (HH:mm),另一方面接受最多 9 位小数的秒数(例如 HH:mm:ss.SSSSSSSSS)。这通常是一个优势;但是如果你想对解析后的字符串做严格的校验,或者你希望字符串输出格式一致,那当然是缺点了。

或使用String.replace(char, char)

其他人会在没有任何明确格式化程序的情况下将 LocalDateTime 对象格式化并解析为 yyyy-MM-dd HH:mm:ss 格式,依赖于它与 Meno Hochschild 提到的 ISO 8601 格式的相似性。

    String str = "2020-04-17 20:23:30";
    LocalDateTime ldt = LocalDateTime.parse(str.replace(' ', 'T'));
    System.out.println(ldt);

输出:

2020-04-17T20:23:30

反之:

    LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Tehran"));
    String str = now.truncatedTo(ChronoUnit.SECONDS)
            .toString()
            .replace('T', ' ');
    System.out.println(str);

2020-04-18 09:35:38