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
单例中提供的那些,但它们似乎没有太大帮助。
我觉得DateTimeFormatter
的documentation已经很清楚了。您提到的具体模式由以下预定义常量支持:
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
我发现自己一遍又一遍地重复相同的代码模式。我正在使用某种日期/时间对象 (Java 8 API),我最终不得不推出自己的 DateTimeFormatter
:
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
DateTimeFormatter.ofPattern("yyyy-MM-dd")
DateTimeFormatter.ofPattern("HH:mm:ss")
这很好,但是..这让我想知道是否没有已经为我完成的预制的?我看了一眼 DateTimeFormatter
单例中提供的那些,但它们似乎没有太大帮助。
我觉得DateTimeFormatter
的documentation已经很清楚了。您提到的具体模式由以下预定义常量支持:
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