【问题标题】:Week numbers from start date to end date Java从开始日期到结束日期的周数 Java
【发布时间】:2018-08-24 14:20:52
【问题描述】:

我试图在 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 年的上周数字等等

有没有好的解决方案?

目前我让它在同一年的日期范围内工作,我尝试的是,我从开始日期和结束日期获取开始周数和结束周数,然后我循环它给出开始值和结束值。但是,如果日期范围落在多年内,那会怎样呢?谁能帮帮我

【问题讨论】:

  • 我不确定你在问什么,但你能抵消几周吗?
  • 如果日期范围跨越多年,您需要每次检查 12 月 31 日是在第 52 周还是第 53 周,其余的应该很简单
  • “目前我已经使用它...”显示您的代码
  • 永远不要使用糟糕的 DateCalendar 类。它们在几年前被现代 java.time 类所取代。

标签: java date week-number


【解决方案1】:

如果你使用的是 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] 的周数

【讨论】:

  • @JavaProgrammer 检查我的编辑,在这种情况下我想使用do{}while 循环,不要忘记检查周数是否大于或等于0
  • 但是当我检查以下两个日期时 2018-08-24T12:18:06,166 和 2018-08-30T12:18:06,166 理想情况下我应该得到 34 和 35 对吗?因为第一个日期在第 34 周,第二个日期在第 35 周
  • 完美。非常感谢您的帮助。你真快:)
  • @JavaProgrammer 啊我不明白你的问题在这种情况下你可以使用WeekFields.SUNDAY_START.weekOfYear() 而不是WeekFields.ISO.weekOfYear() 你的代码看起来像这样:ideone.com/d8HKnN
  • 好的,我想这样就可以了。谢谢
【解决方案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

【讨论】:

  • 2018-W4343 更清晰一个罗勒,所以我应该像这样编写我的代码来得到你的结果ideone demo
  • 感谢 Basil 和 YCF_L
  • @YCF_L 在生成您自己的此类 ISO 8601 字符串时,请确保提取基于周的年份数而不是日历年。如果要在几周或几个季度内完成大量工作,我建议下载 ThreeTen-Extra 库而不是重新发明它。
猜你喜欢
  • 2020-03-18
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多