加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – LocalDate无法使用’yyyy’解析’ww’

发布时间:2020-12-15 04:38:05 所属栏目:Java 来源:网络整理
导读:我必须使用以下格式解析日期:“201710”,其中10周的年份编号.我试图以这种方式实现它: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyw");java.time.LocalDate startDate = java.time.LocalDate.parse("201710",formatter);System.out.
我必须使用以下格式解析日期:“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)

由此产生的日期不同!差异是由日历年的定义引起的,该日历年始终从1月1日开始,而基于周的年份始终在星期一开始(ISO-8601定义),使用至少4天的日历年的第一周.

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

附加说明b):如果您正在为基于周的年份和周年组合寻找真实类型,并使用LocalDate作为此缺失类型的解决方法,那么,您可以在第3个中找到这样的类型 – 派对图书馆,无论是在Threeten-Extra还是在我的图书馆Time4J中.示例:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读