Java 8 DateTimeFormatter 符号 "F"

标签 java java-time datetimeformatter

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,我可以将 2021 年母亲节(美国)定义为“2021-05-2-Sun”,模式为“yyyy-MM-F-EEE”。
但是任何带有符号“F”和 DateTimeFormatter 的模式都可能导致 DateTimeParseException。
我发现一个已经“修复”的问题:
[JDK-8169482]java.time.DateTimeFormatter javadoc: F is not week-of-month
但它只是“修复”了 javadoc! Σ(っ°Д°;)っ
符号“F”仍然具有未定义的行为。

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

最佳答案

由于该错误的解决方案是修复文档,而不是修复 DateTimeFormatter 的实现,因此 F 似乎意味着 ALIGNED_DAY_OF_WEEK_IN_MONTH code> 实际上是有意的,只是 //SDF 注释尚未更正。

因为这意味着 ALIGNED_DAY_OF_WEEK_IN_MONTH ,诸如“2021-05-2-Sun”之类的日期没有多大意义。您只给出了一个月、一年以及星期几。这些信息不足以确定现在是一个月中的哪一天。 “2021-05-2-Sun”不会发生这种情况,但在“2021-05-2-Mon”这样的情况下,星期几 (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

关于Java 8 DateTimeFormatter 符号 "F",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68598541/

相关文章:

java - DateTimeFormatter 是否依赖于操作系统?

java - 如何在 Kotlin 中将日期时间字符串转换为 UTC 格式

java - 设置货币值的格式

java - 使用 JSqlParser 查找 SQL 查询中标记的位置

java - 时区 BST 的偏移量错误

java - 为任意 DatePicker 创建自定义年表

java - java.time 中的 Resoverstyle.STRICT 错误

java - 如何在Java中格式化两个LocalDate变量的范围?

java - Spring + Kerberos + 可信域

java - 减少冗余的设计模式