从开始日期到结束日期的周数Java

时间:2018-08-24 14:20:53

标签: java date week-number

我试图获取介于Java中给定开始日期和结束日期之间的星期数。这是ISO8601日期。

Example 
startDate - "2018-08-24T12:18:06,166"
endDate -  "2019-08-24T11:18:06,166"

当前星期数是34。

对于此示例,我将得到34,35,36 ... 2018年的上周数..1,2 ... 2019年的上周数,依此类推

对此有一个好的解决方案吗?

目前,我可以在相同的年份日期范围内使用它,我尝试的是,我从开始日期和结束日期获取开始周编号和结束周编号,然后循环给出开始值和结束值。但是,如果日期范围落在多年内,它将如何?谁能帮助我

2 个答案:

答案 0 :(得分:4)

如果您使用的是Java 8,则可以使用java.time API,如下所示:

int addWeek = 0;
if(startDate.get(WeekFields.ISO.weekOfYear()) < endDate.get(WeekFields.ISO.weekOfYear())){
    addWeek = 1;
}
long weeks = WEEKS.between(startDate, endDate) + addWeek;//Get the number of weeks in your case (52)
List<Integer> numberWeeks = new ArrayList<>();
if (weeks >= 0) {
    int week = 0;
    do {
        //Get the number of week
        int weekNumber = startDate.plusWeeks(week).get(WeekFields.ISO.weekOfYear());
        numberWeeks.add(weekNumber);
        week++;
    } while (week <= weeks);
}

Ideone demo

[34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]

请注意,您会同时获得两个年份的周数,2018 [34-52]的周数,然后是2019 [1-33]的周数

答案 1 :(得分:2)

Answer by YCF_L是正确的。

YearWeek

您可能想将 ThreeTen-Extra 库添加到项目中,以利用其YearWeek类。此类使用一周的标准ISO 8601定义表示特定的一周:从星期一开始,第1周包含日历年的第一个星期四,日历年的最后几个结束日期/开始日期可能位于下一个/上一个基于周的年份。

YearWeek ywStart = YearWeek.from( startDate ) ;

增加,如另一个答案所示,但收集YearWeek对象而不是整数。

ArrayList< YearWeek > yearWeeks = new ArrayList<>( countOfWeeks + 2 ) ;  // Add one or two for good measure. 
…
YearWeek yw = yw.plusWeeks( 1 ) ;
yearWeeks.add( yw ) ;

要进行报告,请调用YearWeek::toString方法以生成标准ISO 8601格式的文本:yyyy-Www,例如2018-W43