我发现自己一遍又一遍地重复相同的代码模式。我正在使用某种日期/时间对象(Java 8 API),最终不得不推出自己的DateTimeFormatter
:
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
DateTimeFormatter.ofPattern("yyyy-MM-dd")
DateTimeFormatter.ofPattern("HH:mm:ss")
这很好,但是..这让我想知道是否还没有为我完成的预制产品?我对DateTimeFormatter
单例中提供的内容一目了然,但它们似乎并没有太大帮助。
我认为documentation的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”代替空格。
作为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
)。这通常是一个优势。但是,如果您想对已解析的字符串进行严格的验证,或者希望以一致的格式输出字符串,那当然是一个缺点。
其他人将依赖于它与Meno Hochschild提到的ISO 8601格式的相似性,而无需任何显式格式化程序就可以将LocalDateTime
对象与yyyy-MM-dd HH:mm:ss
格式进行格式化和解析。
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