[如果您认为该周将从每年的Jan 01
开始,而周起始为SUNDAY
,那么在2019年将有53个星期。接下来的Jan 29,30,31 2019
将进入Week-53 of 2019
。
如IsoFields的WEEK_OF_WEEK_BASED_YEAR
文档中给出的all three fields are validated against their range of valid values. The week-of-week-based-year field is validated from 1 to 52 or 53 depending on the week-based-year.
因此,我假定以下代码应将输出显示为:WEEK_OF_WEEK_BASED_YEAR
53和WEEK_BASED_YEAR
2019。
但是它的输出为:1和2020
import java.time.LocalDate;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;
import java.time.temporal.IsoFields;
public class WeekStartDemo {
public static void main(String args[]) {
DateTimeFormatter DATE_FORMATTER = DateTimeFormatter
.ofPattern("uuuu-MM-dd")
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(ResolverStyle.STRICT);
LocalDate updatedDate = LocalDate.parse("2019-12-30", DATE_FORMATTER);
System.out.println(updatedDate.toString());
System.out.println(updatedDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println(updatedDate.get(IsoFields.WEEK_BASED_YEAR));
}
}
如果我将日期作为2019-12-28
传递,则它将返回WEEK_OF_WEEK_BASED_YEAR
52和WEEK_BASED_YEAR
2019。但不适用于2019年的最后一周(即第53周)
让我知道以上代码中缺少的内容。
这里的问题是,给定的一年有365天或366天(后一个年份是a年),这意味着每年在52周之外的每一年都有1或2天。一周的ISO体系就是解决这个问题的方法,这意味着有时一年的第一周可能不会在1月1日开始,一年的最后一天也不会落在第52周。一种解决方法是只计算从每年年初开始的一周,例如
LocalDate firstOfYear = LocalDate.of(2019, Month.JANUARY, 1);
LocalDate updatedDate = LocalDate.of(2019, Month.DECEMBER, 30);
int diff = (int)ChronoUnit.DAYS.between(firstOfYear, updatedDate);
int week = 1 + (diff / 7);
System.out.println("The week number is: " + week);
基于ISO-8601(https://www.cl.cam.ac.uk/~mgk25/iso-time.html),这是正确的。 2019年没有日历周53。按照定义,一年的第01周是今年中具有星期四的第一周,它等效于包含一月四日的一周。据我所知,这样做是为了避免没有工作日的cw 1。
正如我在评论中提到的那样,并且从Javadoc链接的IsoFields
中,基于星期的年份本身是相对于标准ISO认可年份定义的。它与标准年份的不同之处在于,它始终始于Monday(而不是星期日)。使用发布的代码查找53周的年份,从IsoFields
迭代到1900
,解析给定年份的最后一天的2300
,并在53处打印值,应该很容易。 ,
WEEK_OF_WEEK_BASED_YEAR
我得到的前几个值是
DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuu-MM-dd")
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(ResolverStyle.STRICT);
for (int i = 1900; i < 2300; i++) {
LocalDate updatedDate = LocalDate.parse(String.format("%d-12-31", i), DATE_FORMATTER);
if (updatedDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) == 53) {
System.out.println(i);
}
}
向前跳过...
1903
1908
1914
1920
1925
1931
1936
1942
所以this年(2020)有53周,而2019年没有。
2009
2015
2020
2026
此行的输出是:
53