当前位置: 首页 > 知识库问答 >
问题:

用DateTimeFormatter解析Java Time的基于周的年份模式

微生耘豪
2023-03-14

我需要以Week-based-Year-Week-of-Week-based-Year的格式输出当前日期,即使用ISO周日期,其中一周总是从周一开始,一年的第一周是1月份至少有四天的第一周(因此是1月份有第一个周四的一周)。

由于2015年12月31日为星期四,星期五至星期日,即2016年1月1日至3日,均属2015年第53周(“漫长的一年”),而2016年第一周于1月4日星期一开始。

从DateTimeFormatter规范中,我希望可以使用模式yyyy-ww来实现这一点(yWeek-based-yearwWeek-of-Week-based-year)。

但是,当我尝试以下简化测试用例时:

String dateString = "2016-01-03";
LocalDate date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String expectedOutput = "2015-53";
String actualOutput = date.format(DateTimeFormatter.ofPattern("YYYY-ww"));
System.out.println("Parsing " + dateString + ", expected "
        + expectedOutput + " but got " + actualOutput);
System.out.println(dateString + " as ISO week date: "
        + date.format(DateTimeFormatter.ISO_WEEK_DATE));

我明白了:

我是否误解了ISO周日期,或者我的代码有错误,或者...我敢说...这是html" target="_blank">java.time库中的bug吗?

我知道我可以使用如下所示的自定义格式化程序来解决这个问题,但在我的情况下,我真的需要使用模式来工作。

new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    .appendValue(IsoFields.WEEK_BASED_YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
    .appendLiteral("-")
    .appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
    .toFormatter();

共有1个答案

薛阳荣
2023-03-14

DateTimeFormatterBuilder的文档指定“y”追加本地化的以周为单位的年份。因此,基于周的year和week字段的含义将取决于格式化程序中设置的区域设置。

 类似资料:
  • 问题内容: 我正在将应用程序从Joda-Time迁移到Java 8 。 我遇到的一件事是使用中的图案打印基于周的年份。 根据文档 但是,当我尝试这两个时,似乎总是会返回与相同的结果。 我的测试代码: 输出: 从重要的年份(例如2000、2005、2009和2016)来看,和的输出是不同的。 在Java的时间与DateTimeFormatter基于周周的–一年模式分析中指出,这与本地化做的(如可以清

  • 我正在将我的应用程序从Joda-Time迁移到Java8。 我遇到的一件事是使用中的模式打印以周为单位的年份。 注意:我已经看到这个问题:Java Time的week-of-week-based-year模式用DateTimeFormatter解析 根据文件 然而,当我尝试这两个时,似乎总是返回与相同的内容。 我的测试代码: 输出: 查看重要的年份(如2000、2005、2009和2016年),和

  • 问题内容: Java 8的类有一个方法,,它使您可以从字符串A-z,a-z字母定义格式。这些例子并没有明确的区别y,今年的时代和Y,以星期为一年。它是什么? 问题答案: 与2006-W52一样,这是“年-周”样式日期的年值。如果有问题的一周跨越年份边界,则可能偏离年份值+1或-1。

  • 如果我使用像这样的模式来创建Java 8 DateTimeFormatter(例如,使用(我将只用于解析,而不是格式化),它将把所有两个字母的年份解释为20xx,例如解析一个字符串,如,将其解释为,这在我的情况下是错误的(应该是在1999年)。 在我的应用程序中,我试图解析OCR文档中的日期,例如,可能仍然是90年代的日期,因此,将日期解释为当前日期之前80年和之后20年的旧SimpleDateF

  • 问题内容: 我遇到的事情几乎可以肯定是我自己的一个愚蠢的错误,但是我似乎无法弄清楚发生了什么。 本质上,我有一系列日期,例如格式的字符串。当我将其转换为日期时间时,年份有时是正确的,但有时并非如此。 例如: 最后两个条目错误,这些年份返回的年份分别为2061和2055。但这对于入门来说效果很好。这里发生了什么? 问题答案: 这似乎是Python库datetime的行为,我做了一个测试,以了解临界点

  • 问题内容: 我想获得任何一年中的周数。即使被接受为全球通用的答案,对于日历,而实际上有几个星期。 有什么方法可以计算出来,或者有什么函数可以帮助我? 问题答案: 根据维基百科关于ISO周日期格式的文章,您可以使用以下代码进行计算。 更新: 似乎来自@Samuel的答案更好,并且没有Luca提到的错误 快速一线: