Java - 如何计算每周的第一天和最后一天

时间:2010-06-11 13:49:37

标签: java calendar

我正在尝试创建一个如下所示的每周日历:http://dhtmlx.com/docs/products/dhtmlxScheduler/sample_basic.html

如何计算每周的日期?例如,本周是:

  

周一至周日
  6月7日,6月8日,6月9日,6月10日,6月11日,6月12日,6月13日

10 个答案:

答案 0 :(得分:41)

我想这可以做你想要的:

// Get calendar set to current date and time
Calendar c = Calendar.getInstance();

// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

// Print dates of the current week starting on Monday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i < 7; i++) {
    System.out.println(df.format(c.getTime()));
    c.add(Calendar.DATE, 1);
}

答案 1 :(得分:8)

本周的第一天。

    Calendar c = Calendar.getInstance();
    while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        c.add(Calendar.DATE, -1);
    }

答案 2 :(得分:7)

使用Java 8中的新日期和时间API,您可以:

LocalDate now = LocalDate.now();

// determine country (Locale) specific first day of current week
DayOfWeek firstDayOfWeek = WeekFields.of(Locale.getDefault()).getFirstDayOfWeek();
LocalDate startOfCurrentWeek = now.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));

// determine last day of current week
DayOfWeek lastDayOfWeek = firstDayOfWeek.plus(6); // or minus(1)
LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(lastDayOfWeek));

// Print the dates of the current week
LocalDate printDate = startOfCurrentWeek;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE dd/MM/yyyy");
for (int i=0; i < 7; i++) {
    System.out.println(printDate.format(formatter));
    printDate = printDate.plusDays(1);
}

答案 3 :(得分:6)

简单地设置星期几似乎不可靠。请考虑以下简单代码:

Calendar calendar = Calendar.getInstance(Locale.GERMANY);
calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF%n", calendar);

calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF%n", calendar);
System.out.printf("First day of week: %d%n", calendar.getFirstDayOfWeek());

运行此程序的结果是:

Starting day: 2011-09-18
Last monday: 2011-09-19
First day of week: 2

换句话说,它及时上升了。对于德国语言环境,这实际上不是预期的答案。请注意,日历正确使用星期一作为一周的第一天(可能只计算一年中的一周)。

答案 4 :(得分:2)

您可以在此基础上进行构建:以下代码打印了从现在起15周内每周的第一个和最后一个日期。

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
for(int i=0; i<15; i++)
{
    System.out.print("Start Date : " + c.getTime() + ", ");
    c.add(Calendar.DAY_OF_WEEK, 6);
    System.out.println("End Date : " + c.getTime());
    c.add(Calendar.DAY_OF_WEEK, 1);
}

答案 5 :(得分:1)

如果您知道哪一天(星期五)和当前日期(六月十一日),您可以计算本周的其他天数。

答案 6 :(得分:1)

我建议您使用Joda时间库。公历日历类有weekOfWeekyear和dayOfWeek方法。

答案 7 :(得分:1)

    Calendar startCal = Calendar.getInstance();
    startCal.setTimeInMillis(startDate);
    Calendar endCal = Calendar.getInstance();
    endCal.setTimeInMillis(endDate);
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy");
    while (startCal.before(endCal)) {
        int weekNumber = startCal.get(Calendar.WEEK_OF_YEAR);
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        cal.set(Calendar.WEEK_OF_YEAR, weekNumber);
        Date sunday = cal.getTime();
        Log.d("sunday", "" + sdf.format(sunday));
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        cal.set(Calendar.WEEK_OF_YEAR, weekNumber);
        Date saturday = cal.getTime();
        Log.d("saturday", "" + sdf.format(saturday));
        weekNumber = weekNumber + 1;
        startCal.set(Calendar.WEEK_OF_YEAR, weekNumber);

    }

答案 8 :(得分:0)

是。使用Joda Time

http://joda-time.sourceforge.net/

答案 9 :(得分:0)

您正在寻找的算法(计算任何给定日期的星期几)是“Zeller's Congruence”。这是一个Java实现:

http://technojeeves.com/joomla/index.php/free/57-zellers-congruence