【发布时间】:2018-03-05 11:21:45
【问题描述】:
我正在将我的应用程序从 Joda-Time 迁移到 Java 8 java.time。
我遇到的一件事是使用DateTimeFormatter 中的模式打印基于周的年份。
注意:我看过这个问题: Java Time's week-of-week-based-year pattern parsing with DateTimeFormatter
根据文档
y year-of-era year 2004; 04
Y week-based-year year 1996; 96
然而,当我尝试这两个时,Y 似乎总是返回与 y 相同的结果。
我的测试代码:
DateTimeFormatter yearF = DateTimeFormatter.ofPattern("yyyy").withZone(ZoneOffset.UTC);
DateTimeFormatter weekYearF = DateTimeFormatter.ofPattern("YYYY").withZone(ZoneOffset.UTC);
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR_OF_ERA) .appendLiteral(" ") .append(yearF)
.appendLiteral(" -- ")
.appendValue(IsoFields.WEEK_BASED_YEAR) .appendLiteral(" ") .append(weekYearF)
.toFormatter()
.withZone(ZoneOffset.UTC);
System.out.println(dateTimeFormatter.toString());
ZonedDateTime dateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(946778645000L), ZoneOffset.UTC);
for (int i = 2000 ; i < 2020; i ++ ) {
System.out.println(dateTime.withYear(i).format(dateTimeFormatter));
}
输出:
Value(YearOfEra)' '(Value(YearOfEra,4,19,EXCEEDS_PAD))' -- 'Value(WeekBasedYear)' '(Localized(WeekBasedYear,4,19,EXCEEDS_PAD))
2000 2000 -- 1999 2000
2001 2001 -- 2001 2001
2002 2002 -- 2002 2002
2003 2003 -- 2003 2003
2004 2004 -- 2004 2004
2005 2005 -- 2004 2005
2006 2006 -- 2006 2006
2007 2007 -- 2007 2007
2008 2008 -- 2008 2008
2009 2009 -- 2009 2009
2010 2010 -- 2009 2010
2011 2011 -- 2010 2011
2012 2012 -- 2012 2012
2013 2013 -- 2013 2013
2014 2014 -- 2014 2014
2015 2015 -- 2015 2015
2016 2016 -- 2015 2016
2017 2017 -- 2017 2017
2018 2018 -- 2018 2018
2019 2019 -- 2019 2019
看看重要的年份(如 2000 年、2005 年、2009 年和 2016 年),.appendValue(IsoFields.WEEK_BASED_YEAR) 和 .ofPattern("YYYY") 的输出是不同的。
在Java Time's week-of-week-based-year pattern parsing with DateTimeFormatter 中声明这与本地化有关(可以清楚地看到toString() 与DateTimeFormatter 的区别)。
现在我不明白/不需要的东西很少:
因此,“基于周的年份”会随区域设置而变化,很好。然而,我不明白的是,在某些语言环境中,周基准年总是与“正常”年相同。这是为什么呢?
为什么
YYYY的解析没有映射到 ISO-8601 定义,而不是(非常混乱!)本地化形式。我在哪里可以找到这方面的适当文档?至少可以说,来自 Oracle 的明显“官方”文档含糊不清。 Answer:我发现了更广泛的文档 DateTimeFormatterBuilder.
【问题讨论】:
-
对于您的第一个问题,02-01-2000 仍然是 1999 年的第 52 周。这让您回到了 1999 年。2005 年和 2016 年也是如此。
-
@YoshuaNahar:我的意思是我希望年份和基于周的年份每隔几年就会有所不同。我很惊讶,显然在某些语言环境中没有区别。
标签: java datetime java-8 java-time dayofweek