【问题标题】:Getting the start and the end date of a week using java calendar class使用java日历类获取一周的开始和结束日期
【发布时间】:2011-10-04 08:32:42
【问题描述】:

我想获取给定日期一周的最后一周和第一周。 例如,如果日期是 2011 年 10 月 12 日,那么我需要 2011 年 10 月 10 日(作为一周的开始日期)和 2011 年 10 月 16 日(作为一周的结束日期)的日期 有谁知道如何使用日历类(java.util.Calendar)获取这两个日期 非常感谢!

【问题讨论】:

标签: java calendar dayofweek


【解决方案1】:

一些代码如何使用Calendar 对象来实现。我还应该提到joda time library,因为它可以帮助您解决很多Date/Calendar 问题。

代码

public static void main(String[] args) {

    // set the date
    Calendar cal = Calendar.getInstance();
    cal.set(2011, 10 - 1, 12);

    // "calculate" the start date of the week
    Calendar first = (Calendar) cal.clone();
    first.add(Calendar.DAY_OF_WEEK, 
              first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK));

    // and add six days to the end date
    Calendar last = (Calendar) first.clone();
    last.add(Calendar.DAY_OF_YEAR, 6);

    // print the result
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(df.format(first.getTime()) + " -> " + 
                       df.format(last.getTime()));
}

【讨论】:

  • 我认为last.add(Calendar.DAY_OF_YEAR, 6);有一个错字
  • 哎呀,我的错。我以为那是一年:) 对不起,你的回答是正确的
  • 在某些情况下,当语言环境将一周的开始设置为星期日以外的其他值时,此操作会失败。例如,在意大利,一周的开始是星期一,所以当 cal 是星期天时,first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK)MON - SUN,即 2 - 1,因此您需要添加天数而不是减去天数。这会导致您的 firstlast 日期错误地落在下周。一种解决方案是确保偏移量始终为零或负数,即:int weekDayOffset = first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK); if (weekDayOffset > 0) weekDayOffset -= 7;
【解决方案2】:

此解决方案适用于任何地区(一周的第一天可以是星期日或星期一)。

Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - c.getFirstDayOfWeek();
c.add(Calendar.DAY_OF_MONTH, -dayOfWeek);

Date weekStart = c.getTime();
// we do not need the same day a week after, that's why use 6, not 7
c.add(Calendar.DAY_OF_MONTH, 6); 
Date weekEnd = c.getTime();

例如,今天是 2014 年 1 月 29 日。对于以星期日为一周第一天的语言环境,您将获得:

    start: 2014-01-26
    end: 2014-02-01

对于以星期一为第一天的语言环境,日期将为:

    start: 2014-01-27
    end: 2014-02-02

【讨论】:

    【解决方案3】:

    如果你想要所有日期,那么

    first.add(Calendar.DAY_OF_WEEK,first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK)); 
    
    for (int i = 1; i <= 7; i++) {
        System.out.println( i+" Day Of that Week is",""+first.getTime());
        first.add(Calendar.DAY_OF_WEEK,1);
    }
    

    【讨论】:

      【解决方案4】:

      这里是示例代码

      public static void main(String[] args) {
      
          Calendar cal = Calendar.getInstance();
          cal.set(2016, 2, 15);
      
          {
              Calendar startCal = Calendar.getInstance();
              startCal.setTimeInMillis(cal.getTimeInMillis());
      
              int dayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);
              startCal.set(Calendar.DAY_OF_MONTH,
                      (startCal.get(Calendar.DAY_OF_MONTH) - dayOfWeek) + 1);
      
              System.out.println("end date : " + startCal.getTime());
          }
      
          {
              Calendar endCal = Calendar.getInstance();
              endCal.setTimeInMillis(cal.getTimeInMillis());
      
              int dayOfWeek = endCal.get(Calendar.DAY_OF_WEEK);
              endCal.set(Calendar.DAY_OF_MONTH, endCal.get(Calendar.DAY_OF_MONTH)
                      + (7 - dayOfWeek));
      
              System.out.println("start date : " + endCal.getTime());
      
          }
      }
      

      将打印出来

      start date : Sun Mar 13 20:30:30 IST 2016
      end date : Sat Mar 19 20:30:30 IST 2016
      

      【讨论】:

        【解决方案5】:

        我发现接受答案中的公式仅在某些情况下有效。例如,您的一周从星期六开始,今天是星期日。为了到达一周的第一天,我们往回走 1 天,但公式 cal.get(Calendar.DAY_OF_WEEK) - cal.getFirstDayOfWeek() 将给出答案 -6。解决方案是使用模数,因此可以说公式环绕。

        int daysToMoveToStartOfWeek =  (
          7 + 
          cal.get(Calendar.DAY_OF_WEEK) - 
          cal.getFirstDayOfWeek()
        )%7;
        
        cal.add(Calendar.DAY_OF_WEEK, -1 * daysToMoveToStartOfWeek);
        

        【讨论】:

        • 您能否解释一下答案中的代码?
        猜你喜欢
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多