12

我需要得到上周星期一和星期五的日期。为此,我得到本周星期一的日期并减去 7 天。这给了我上周星期一的日期。

要获得星期五的日期,我必须添加 4。这让我有点困惑,因为出于某种原因,一周的第一天是星期日,而不是英国的星期一。

无论如何,这就是我获取日期的方式。

            // Get the dates for last MON & FRI
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.add(Calendar.DAY_OF_WEEK, -7);

        cal.set(Calendar.HOUR_OF_DAY,0);
        cal.set(Calendar.MINUTE,0);
        cal.set(Calendar.SECOND,0);
        cal.set(Calendar.MILLISECOND,0);

        // Get the date on Friday
        cal.add(Calendar.DAY_OF_WEEK, 4);

        cal.set(Calendar.HOUR_OF_DAY,23);
        cal.set(Calendar.MINUTE,59);
        cal.set(Calendar.SECOND,59);
        cal.set(Calendar.MILLISECOND,0);

以上有效,但如果逻辑有任何问题,我很感兴趣。即它适用于二月,闰年等。

随意提出更好的解决方案/方法。

谢谢

4

4 回答 4

23
于 2016-09-19T19:47:35.580 回答
10

注意:对于 Java 8 及更高版本,请查看Basil Bourque的回答(链接)。
Java 8 引入了一个新的时间/日期 API,它提供了 Joda-Time 的大部分功能。


Joda-Time为此类问题提供了非常好的方法。

使用 Joda Time 获取上周星期一和星期五的日期看起来像这样:

DateTime today = DateTime.now();
DateTime sameDayLastWeek = today.minusWeeks(1);
DateTime mondayLastWeek = sameDayLastWeek.withDayOfWeek(DateTimeConstants.MONDAY);
DateTime fridayLastWeek = sameDayLastWeek.withDayOfWeek(DateTimeConstants.FRIDAY);

您可以DateTimejava.util.Date对象创建对象,反之亦然,因此很容易与 Java 日期一起使用。


使用上面的代码和日期

DateTime today = new DateTime("2012-09-30");

结果为星期一的“2012-09-17”和星期五的“2012-09-21”,将日期设置为

DateTime tomorrow = new DateTime("2012-10-01");

结果为星期一的“2012-09-24”和星期五的“2012-09-28”。

于 2012-09-30T12:44:56.703 回答
6

您仍然将一周开始设置为星期日,这意味着Calendar.MONDAY星期六是前星期一,而Calendar.MONDAY星期日是第二天。

您需要做的是(根据您上面的评论根据您想要的方式),将一周的开始设置为星期一。

Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DAY_OF_WEEK, -7); 
...

除此之外,并且星期五的最后一秒不包括在范围内,您的逻辑似乎是合理的,并且在闰年/夏令时转变等方面应该没有问题。

于 2012-09-30T13:16:35.407 回答
1

我唯一看到的错误是您实际上是在测试Mo-Fr的范围,而不是如前所述,检索两个特定的日子。使用专属上限测试 Mo-Sa 范围会更安全。

于 2012-09-30T12:27:17.190 回答