【问题标题】:Why is Java Calendar saying the first Thursday of the month is Week 5?为什么 Java 日历说每月的第一个星期四是第 5 周?
【发布时间】:2013-06-15 11:14:57
【问题描述】:

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

  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

【问题讨论】:

  • 你的时区是多少?对我来说,它打印Week of month: 1
  • 东部标准时间。我在大西洋沿岸。我清理了我的项目并再次运行它,仍然得到 5。这可能与第 1 周没有星期四有关吗?当我输入 2、3、4、5 作为周数时,我得到了我所期望的。
  • 我还收到“每月的第 1 周”您是否准确复制了您的代码,或者您是否重新输入了代码,但略有不同?
  • @jhamm:就是这样。这适用于您的语言环境。本月第一周(6 月)的星期四是 5 月 30 日。
  • 那么在一个月的第一周是星期五并且我想要第二周的第一个星期四的类似情况下,我如何以编程方式设置警报。必须有更好的方法!

标签: java calendar


【解决方案1】:

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

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

由于 6 月的第 1 周没有星期四,lenient 日历将 DAY_OF_WEEK, THURSDAY 解释为 2013 年第 22 周的星期四,即 2013 年 5 月 30 日,即第 5 周5 月,所以你的输出中得到 5 而不是 1。

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

 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 是本月的第二个星期四,依此类推。这不是特定于语言环境或对(错误的)解释开放的那么什么天构成该月的第一周。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2017-11-23
    相关资源
    最近更新 更多