在 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/