获得一个月的第三个星期五

Ajm*_*mad 5 java calendar

我正在为我的应用程序开发本地日历。但这是每月重复事件(星期几)的问题。

当我创建一个从16-9-2016(16 SEP 2016 FRIDAY)每个月的第三个星期五开始并重复的事件时。但下个月它会在 2016 年 14 月 10 日的第二个星期五创建(这就是问题所在)。下个月将是第三个星期五。

我的代码是

public Date nthWeekdayOfMonth(int dayOfWeek, int month, int year, int week, TimeZone timeZone) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(timeZone);
        calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
        calendar.set(Calendar.WEEK_OF_MONTH, week);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.YEAR, year);
        return calendar.getTime();
    }
Run Code Online (Sandbox Code Playgroud)

我知道这个问题。但我不知道如何修复它..有什么办法可以修复它吗?

px0*_*x06 4

您的代码似乎工作完全正常,从我看来没有任何问题,可能是您的参数错误。

需要注意的是,MONTHDAY是从 0 开始的 so,0 = January因此0 = Sunday获取第三个星期五的参数应如下所示:

nthWeekdayOfMonth(6, 9, 2016, 3, TimeZone.getTimeZone("Europe/London"));
Run Code Online (Sandbox Code Playgroud)

返回以下输出:

Fri Oct 21 11:06:33 BST 2016
Run Code Online (Sandbox Code Playgroud)

分解它:

  1. 一周中的某一天是 6,因为星期日 = 0。
  2. 月份是 9 - 即十月
  3. 年份正常 - 2016
  4. 周不是从 0 开始的,因此第三周将是索引 3
  5. 时区正常

请参阅日历文档以供参考。


编辑

因此,由于某种原因,它在我的机器上可以运行,但在其他机器上则不行;我不知道这可能是什么问题,但使用DAY_OF_WEEK_IN_MONTH似乎是更好的选择:

public static Date nthWeekdayOfMonth(int dayOfWeek, int month, int year, int week, TimeZone timeZone) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(timeZone);
    calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
    //calendar.set(Calendar.WEEK_OF_MONTH, week);
    calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, week);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.YEAR, year);
    return calendar.getTime();
}
Run Code Online (Sandbox Code Playgroud)

我经常使用,GregorianCalendarCalendar应该工作得很好。

应该(希望)在大多数情况下有效,我已经在其他机器和ideone上测试过它。