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



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

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

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

我认为DateTimeFormatter的文档非常清楚。您提到的具体模式由以下预定义常量支持:

yyyy-MM-dd=> ISO_LOCAL_DATE

HH:mm:ss=> ISO_LOCAL_TIME

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

yyyy-MM-dd HH:mm:ss:从内置零件组装

作为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

相关内容

  • 没有找到相关文章