我正在为我的应用程序开发本地日历。但这是每月重复事件(星期几)的问题。
当我创建一个从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)
我知道这个问题。但我不知道如何修复它..有什么办法可以修复它吗?
您的代码似乎工作完全正常,从我看来没有任何问题,可能是您的参数错误。
需要注意的是,MONTH和DAY是从 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)
分解它:
请参阅日历文档以供参考。
因此,由于某种原因,它在我的机器上可以运行,但在其他机器上则不行;我不知道这可能是什么问题,但使用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)
我经常使用,GregorianCalendar但Calendar应该工作得很好。
这应该(希望)在大多数情况下有效,我已经在其他机器和ideone上测试过它。