2

java.time.format.DateTimeFormatterBuilder

/** Map of letters to fields. */
private static final Map<Character, TemporalField> FIELD_MAP = new HashMap<>();

static {
    // SDF = SimpleDateFormat
    // ...
    FIELD_MAP.put('F', ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);  // SDF, LDML
    // ...
}

这表明符号“F”在 SimpleDateFormatter(SDF) 中可能具有相同的含义。

在 SDF 中,符号“F”表示指定星期几的序数,例如“五月的第二个星期日”、母亲节(美国)。
使用 SDF,我可以用模式“yyyy-MM-F-EEE”的“2021-05-2-Sun”来定义 2021 年的母亲节(美国)。
但是任何带有 DateTimeFormatter 符号“F”的模式都可能导致 DateTimeParseException。
我发现一个已经“修复”的问题:
[JDK-8169482]java.time.DateTimeFormatter javadoc: F is not week-of-month
但它只是“修复”了javadoc!Σ(っ °Д °;)っ<br /> 符号“F”仍然具有未定义的行为。

SDF“F:月中的星期几”中令人困惑的描述可能是原因。

4

1 回答 1

3

由于该错误的解决方案是修复文档,而不是修复DateTimeFormatter' 的实现,因此看起来实际上是F有意ALIGNED_DAY_OF_WEEK_IN_MONTH的,只是// SDF注释尚未更正。

因为这意味着ALIGNED_DAY_OF_WEEK_IN_MONTH,像“2021-05-2-Sun”这样的日期没有多大意义。你只给了一个月和一年,以及一周中的哪一天。没有足够的信息来确定它是一个月中的哪一天。“2021-05-2-Sun”不会发生这种情况,但在“2021-05-2-Mon”这样的情况下,星期几(星期一)和对齐的星期几(2)甚至可以说关于应该是星期几的不同事情。:)

要解析“一周中的第 n 天”,您需要ALIGNED_WEEK_OF_MONTH,它DateFormatter没有符号。(请注意,这W是一个月中未对齐的一周。)但不用担心,您可以使用以下命令将任何内容附加TemporalField到模式中appendValue

DateTimeFormatter formatter =
    new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-")
        .appendValue(ChronoField.ALIGNED_WEEK_OF_MONTH)
        .appendPattern("-EEE").toFormatter(Locale.ENGLISH);

用法:

System.out.println(LocalDate.parse("2021-05-2-Sun", formatter));
// 2021-05-09
于 2021-07-31T02:32:12.377 回答