gpt4 book ai didi

java - LocalDate 无法用 'ww' 解析 'yyyy'

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:00 31 4
gpt4 key购买 nike

我必须使用以下格式解析日期:“201710”,其中 10 - 一年中的第几周。我试图以这种方式实现它:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyw");
java.time.LocalDate startDate = java.time.LocalDate.parse("201710", formatter);
System.out.println(startDate);

但它抛出异常:

java.time.format.DateTimeParseException: Text '201710' could not be parsed at index 0   

然后我需要从 LocalDate 对象获取一周的第一天和最后一天。例如“201710”- 05.03 12.03(一周的第一天必须是星期日)。

最佳答案

@Kayaman 接受的答案是不正确的,因为您不能混合使用标准日期表示(使用 yyyy = 年份)和星期日期表示(使用 ww = 基于星期的年份)。 标准日历年和基于星期的年份之间的细微差别与日历年的开始或结束有关。结论:不要使用符号“y”,而是使用符号“Y” .输入“201501”的反例:

正确的解决方案

DateTimeFormatter formatter =
new DateTimeFormatterBuilder()
.appendValue(WeekFields.ISO.weekBasedYear(), 4)
.appendValue(WeekFields.ISO.weekOfWeekBasedYear(), 2)
.parseDefaulting(ChronoField.DAY_OF_WEEK, 1)
.toFormatter();
LocalDate startDate = LocalDate.parse("201501", formatter);
System.out.println(startDate); // 2014-12-29

基于@Kayaman的提议:

DateTimeFormatter dtf =
new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR, 4)
.appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR, 2)
.parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
.toFormatter();
System.out.println(LocalDate.parse("201501", dtf)); // 2015-01-05 (wrong)

结果日期不同!差异是由日历年的定义引起的,日历年总是从一月一日开始,而基于周的年份总是从星期一开始(ISO-8601 定义),使用日历年的第一周至少有 4 天。

附加说明 a):Java-8 不管理可本地化字段的相邻数字解析,例如基于周的字段(另请参阅相关的 JDK issue ),因此我选择了基于构建器的解决方案而不是定义模式“YYYYww”(然而,Java-9 promise 提供解决方案)。但即使使用 Java-9,基于构建的方法仍然是必要的,因为需要为缺少的星期几定义默认值(此处:设置为星期一)。

附加说明 b): 如果您正在寻找基于周的年份和年份的组合的真实类型,并且使用 LocalDate 作为这种缺失类型的解决方法,您可以在 Threeten-Extra 或我的库 Time4J 中的第 3 方库中找到这种类型。示例:

    ChronoFormatter<CalendarWeek> cf =
ChronoFormatter.ofPattern(
"YYYYww",
PatternType.CLDR,
Locale.ROOT,
CalendarWeek.chronology()
);
CalendarWeek cw = cf.parse("201501");
System.out.println(cw); // 2015-W01
System.out.println(cw.at(Weekday.MONDAY)); // 2014-12-29

关于java - LocalDate 无法用 'ww' 解析 'yyyy',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42978325/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com