在java.util.Calendar中更改周中的天是如何工作的?

在java.util.Calendar中更改周中的天是如何工作的?,java,datetime,Java,Datetime,我正在尝试更改日历中的星期几,但似乎并不像我预期的那个样工作。这里有一个例子。我将日历时间设置为周五时间,但当我将calendar.DAY\u OF_WEEK设置为calendar.SUNDAY时,它将前进到下周。由于Calendar.SUNDAY默认为一周的第一天,它不应该将时间移回当前周的开始吗 import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; public c

我正在尝试更改日历中的星期几,但似乎并不像我预期的那个样工作。这里有一个例子。我将日历时间设置为周五时间,但当我将calendar.DAY\u OF_WEEK设置为calendar.SUNDAY时,它将前进到下周。由于Calendar.SUNDAY默认为一周的第一天,它不应该将时间移回当前周的开始吗

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class GenericWeekdayOpenFunction implements TimePeriodFunction {

    public static void main(String[] args) {
        // Nov 8 is Friday
        long time = DateUtilities.newDateTimeAsMillis(2013, 11, 8, 10, 00, 00);
        System.out.println(DateUtilities.formatGmtDatetime(time));

        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
        calendar.setTimeInMillis(time);

        // move day of week to Sunday, expect date to be Nov 3
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        System.out.println(DateUtilities.formatGmtDatetime(calendar.getTimeInMillis()));    // wrong

        // move day of week to Friday, expect date to be Nov 8
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
        System.out.println(DateUtilities.formatGmtDatetime(calendar.getTimeInMillis()));
    }

}
输出:

08-11-2013 10:00:00.000
10-11-2013 10:00:00.000
08-11-2013 10:00:00.000

我认为方法
set(int字段,int值)
接近最近一天的工程(不是同一周的第二天)。
但是您可以使用函数
add(int field,int amount)
在本例中
add(Calendar.DATE,-5)
来完成此操作。

您的场景在基本
Calendar
类用法下运行良好:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
Date d = new Date(113, 10, 8, 10, 0, 0);
c.setTimeInMillis(d.getTime());
System.out.println(c.getTime());
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
System.out.println(c.getTime());
c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
System.out.println(c.getTime());
输出:

08-11-2013 10:00:00.000
10-11-2013 10:00:00.000
08-11-2013 10:00:00.000
2013年11月8日星期五10:00:00 IST

2013年11月3日星期日10:00:00 IST

2013年11月8日星期五10:00:00 IST

注意
日期(113,10,8,10,0,0)
仅用于快速检查,但不推荐使用。尝试任何其他组合也可以。你能试着用基本的
Calendar
API打印日期吗

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
System.out.println(c.getTime());//current day
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
System.out.println(c.getTime());

第二次约会应该追溯到上个星期天,而不是下个星期天。如果它对您有效,那么
DateUtilities
的实现可能会有疑问。

此外,更改为一周中的其他任何一天也会起作用。只有“星期日”失败。在真实场景中,我不知道当前时间的星期几,但我需要检索一个包含当前星期开始和结束日期的窗口。然后使用:
if(cal.get(Calendar.day\u of_week)==Calendar.Sunday){cal.add(Calendar.DATE,-6)}
如果我使用上述代码,它仍然打印相同的结果(与您的不同),因此calendar类可能有所不同。您的JVM版本是什么?我现在使用的是原始历元值(1383904800000),对应于2013/11/08 10:00:00 GMTmy版本是1.6.0_43。运行与上面完全相同的代码会产生不同的结果(将星期日向前移动一周)