在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中,符号"F“是指一周中指定日期的序号,如”5月的第二个星期日“,即母亲节(US)。
使用SDF,我可以将2021年的母亲节(美国)定义为"2021-05-2-Sun“,其模式为”yyyy F“。
但是带有DateTimeFormatter符号"F“的任何图案都可能导致DateTimeParseException。
我发现一个已经“解决”的问题:
[JDK-8169482]java.time.DateTimeFormatter javadoc: f不是每月一周
但它只“修正”了javadoc!Σ(っ°Д°;)っ
符号"F“仍然具有未定义的行为。
SDF中令人困惑的描述"F:月中的一周“可能就是原因。
发布于 2021-07-31 02:32:12
由于错误的解决方法是修复文档,而不是修复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-星期一”的情况下,一周中的一天(星期一)和一周中的对齐日(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-09https://stackoverflow.com/questions/68598541
复制相似问题