ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-27 08:59:40  阅读:715  来源: 互联网

标签:localdate java datetime-format


我必须使用以下格式解析日期:“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

标签:localdate,java,datetime-format
来源: https://codeday.me/bug/20190727/1552489.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有