java.time是否为诸如“ yyyy-MM-dd”,“ HH:mm:ss”或类似变体之类的模式带来默认的DateTimeFormatters?

问题描述 投票:1回答:2

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

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

这很好,但是..这让我想知道是否还没有为我完成的预制产品?我对DateTimeFormatter单例中提供的内容一目了然,但它们似乎并没有太大帮助。

java datetime java-time
2个回答
3
投票

我认为documentationDateTimeFormatter很清楚。以下预定义的常量支持您提到的具体模式:

yyyy-MM-dd => ISO_LOCAL_DATE

HH:mm:ss => ISO_LOCAL_TIME

仅第一个示例“ yyyy-MM-dd HH:mm:ss”与任何预定义的格式化程序都不匹配,因此您只需指定模式即可构造它(如您已经完成的操作)。 ISO_LOCAL_DATE_TIME非常相似,但用ISO文字“ T”代替空格。


2
投票

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)

其他人将依赖于它与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

© www.soinside.com 2019 - 2024. All rights reserved.