簡體   English   中英

為什么Java Calendar會說本月的第一個星期四是第5周?

[英]Why is Java Calendar saying the first Thursday of the month is Week 5?

我想弄清楚如何在一周的特定日期發出警報。 這是打印我期望的示例代碼:

  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時間不是我正在做的選擇,所以我需要使用常規Java庫來完成這項工作。 謝謝你的幫助。

編者注

上面的代碼將根據它運行的日期返回不同的結果,因為Calendar.getInstance()返回一個設置為當前時間的Calendar。 有關與當前時間無關的問題的說明,請使用以下命令:

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

默認情況下,Java Calendar寬松的。 如果將其設置為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在你的輸出中。

要設置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是該月的第二個星期四,等等。這遠遠少於特定於語言環境或開放(錯誤)解釋然后是什么日子構成這個月的第一周。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM