4

我想弄清楚如何在一周中的特定日子发出警报。这是打印我期望的示例代码:

  Calendar calendar = Calendar.getInstance();
  calendar.set(Calendar.WEEK_OF_MONTH, 1);
  System.out.println("Week of month: " + calendar.get(Calendar.WEEK_OF_MONTH)); // Week of month: 1

但是当我将它添加到代码中时,我得到了一个我不明白的结果:

  Calendar calendar = Calendar.getInstance();
  calendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
  calendar.set(Calendar.WEEK_OF_MONTH, 1);
  System.out.println("Week of month: " + calendar.get(Calendar.WEEK_OF_MONTH)); // Week of month: 5

我正在尝试为特定一周中的特定日期设置闹钟。今天的日期是 2013 年 6 月 15 日。谁能给我解释一下。Joda time 不是我正在做的事情的选择,所以我需要使用常规的 Java 库来完成这项工作。感谢所有的帮助。

编者注

上面的代码会根据运行的日期返回不同的结果,因为Calendar.getInstance()返回的是一个设置为当前时间的日历。要说明与当前时间无关的问题,请使用以下命令:

DateFormat dateFormat = DateFormat.getDateInstance();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(1371294000000L);
System.out.println(dateFormat.format(calendar.getTime()));
calendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
System.out.println(dateFormat.format(calendar.getTime()));
calendar.set(Calendar.WEEK_OF_MONTH, 1);
System.out.println("Week of month: " + calendar.get(Calendar.WEEK_OF_MONTH)); 
System.out.println(dateFormat.format(calendar.getTime()));

输出类似这样的内容(至少如果您的默认语言环境使用公历):

Jun 15, 2013
Jun 13, 2013
Week of month: 5
May 30, 2013
4

1 回答 1

5

Java日历默认是宽松的。如果您将其设置为 1 月 32 日,它会将其转换为 2 月 1 日。此外,“周”的定义是特定于语言环境的,并且有点令人困惑。这在上面链接的 JavaDocs 中有详细的解释。

在您的特定情况下(或至少在我的语言环境中),一周被定义为从星期日开始,“六月的第一周”被定义为包括 6 月 1 日的星期日到星期六期间。2013 年 6 月 1 日是星期六,2013 年第 22 周的最后一天。2013 年 6 月 2 日星期日是 6 月第 2 周的第一天,而不是第 1 周的第二天。

由于 6 月的第 1 周没有星期四,因此宽松日历解释DAY_OF_WEEK, THURSDAY为 2013 年第 22 周的星期四,即 2013 年 5 月 30 日,即 5 月的第 5 周,因此输出中得到 5 而不是 1 .

要设置六月的第一个星期四,您需要:

 Calendar calendar = Calendar.getInstance();
 calendar.set(Calendar.MONTH, Calendar.JUNE);
 calendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
 calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);

DAY_OF_WEEK_IN_MONTH可能有点混乱。你用它DAY_OF_WEEK来指定您想要在该月中出现的那一天。因此,何时DAY_OF_WEEK设置为星期四,DAY_OF_WEEK_IN_MONTH, 1是每月的第一个星期四,是每月DAY_OF_WEEK_IN_MONTH, 2的第二个星期四,等等。这对于特定于区域设置或对(错误)解释的开放性要少得多,然后是哪些天构成了该月的第一周。

于 2013-06-15T21:58:09.297 回答