Java时间:获得特定年份的最大周数
我只找到了Joda Time的解决方案。Java时间:获得特定年份的最大周数
我的解决办法只能如果最后一天不在第一周:
LocalDate.now() // or any other LocalDate
.withDayOfMonth(31)
.withMonth(12)
.get(weekFields.weekOfWeekBasedYear())
那么,什么是Java中的时间以正确的方式(如在约达时间)?
这些信息直接使用java.time.*
API提供。
关键的方法是rangeRefinedBy(Temporal)
在TemporalField
。它可以让你获得一个ValueRange
对象为外地提供的最小值和最大值,在经过时间的对象细化
要找出多少ISO周也有在今年,执行以下操作:
LocalDate date = LocalDate.of(2015, 6, 1);
long weeksInYear = IsoFields.WEEK_OF_WEEK_BASED_YEAR.rangeRefinedBy(date).getMaximum();
System.out.println(weeksInYear);
请注意,您传入的日期用于确定答案。因此,在1月初或12月下旬通过日期时,请确保您了解ISO基于星期的日历的工作方式,以及日历年和周一年之间的差异。
这让我感到惊讶,我们现在拥有Java 8时间库的功能。 – YoYo
看来,当最后一天是第一周,你不想让1
作为一个答案,但52/3/4
,在这种情况下,你可能会寻找:
LocalDate.of(2017, 12, 31).get(WeekFields.ISO.weekOfYear());
有几种定义周数的方法 - 如果没有做到你想要的,你需要澄清你想要使用的方法。
尝试2012年,2013年,2014年和2015年:你应该得到53. – assylias
对不起,在我的测试中的错误。那些年我得到53。 –
正确和最佳的解决方案由@JodaStephen给出。无论如何,这里有一些替代品。
月,28始终是在上周的一年,因为剩余的三天不能形成一个星期的主要部分:
int weeks = LocalDate.of(2017, 12, 28).get(WeekFields.ISO.weekOfYear());
一年有53个星期,如果它开始或结束与星期四:
Year year = Year.of(2017);
DayOfWeek firstDay = year.atDay(1).getDayOfWeek();
DayOfWeek lastDay = year.atDay(year.length()).getDayOfWeek();
int weeks = firstDay == DayOfWeek.THURSDAY || lastDay == DayOfWeek.THURSDAY ? 53 : 52;
最后,这会给你一年的最后一天的“周编号”。如果最后一周的主要部分在下一年(这一周是第二年宣称的),那么在上周的数字是52的情况下也是53。
// This will not give the correct number of weeks for a given year
Year year = Year.of(2018);
year.atDay(year.length()).get(WeekFields.ISO.weekOfYear()); // 53
这就是你实际做的。
没有完全理解我在2010年到2020年尝试的问题。在2015年和2020年,我得到了53周。对于2010年,2011年,2016年和2017年,我得到了52份。我相信所有这些都是正确的。我的困惑是,在2012年,2013年,2014年,2018年和2019年,第一个片段产生53,第二个片段52 –
@ OleV.V。你是对的 - 更新。 – steffen
感谢您满足我的好奇心,我想我明白了现在的差异。 –
因此,您试图确定当年是否有52周或53周(已编号),我理解正确吗?对于美国或国际周编号,还是应该适用于两者? –
由于根据ISO一周至少有四个日子属于哪一年,因此您可能会询问12月28日的周数。由于这一天只有三天,因此保证在最后一次编号一年中的一周。我承认有点棘手。同样,1月4日总是在第1周。 –
请注意,如果您的代码在31天后的几个月内运行,您的代码才会有效!你需要交换两行'.withDayOfMonth(31)'和'.withMonth(12)'。 – steffen