我需要獲得給定日期的一年中的一周。使用 SimpleDateFormat 會在一年的最后一周產生錯誤的結果。
例子:
這將正確生成第 52 周:
SimpleDateFormat w = new SimpleDateFormat("w");
Calendar c = Calendar.getInstance();
c.set(2021, 11, 25);
System.out.println("Week: ${w.format(c.getTime())}");
產生: Week: 52
但是第二天已經被認為是明年的第一周?
SimpleDateFormat w = new SimpleDateFormat("w");
Calendar c = Calendar.getInstance();
c.set(2021, 11, 26);
System.out.println("Week: ${w.format(c.getTime())}");
產生: Week: 1
這僅發生在 Java 7 中,而不發生在 Java 8 及更高版本中!
uj5u.com熱心網友回復:
不要使用Calendar. 它已經過時了,更重要的是,它的API非常糟糕。
有一個和我的腿一樣長的清單,說明它出了什么問題。與此處相關的大約 200 件事中的具體一項是,笨拙地,它的月份值為0索引。那么,'12, 3'?那是 12 月 3 日,或者隨便你怎么稱呼第 13 個月。那,或者日歷不做第 13 個月,在這種情況下,它只是假設您打算說 3rd of jan 2022 。不管怎樣,那是第 1 周。
那么為什么 12 月 2 日(或者,如果您愿意,通過翻轉,2022 年 1 月 2 日)是“第 52 周”?
因為它是。
周數很奇怪,但必須如此。一周從星期一(或星期日,對于我愛美國弟兄們的愚蠢標準而言)開始,并且不能從任何其他日期開始。這意味著除非 1 月 1 日恰好是星期一,否則會有一些奇怪的事情發生;2021 年的天數計為“2022 年的第 1 周”,或 2022 年的天數計為“2021 年的第 52 周”。事實上,不時會有一個星期 53。畢竟 52*7 是 364,但是一年有 365.2475 天,所以除非你只是想讓一些日子不存在,否則每個因此,通常需要 53 周才能將其全部加起來。
使用java.time代替。
LocalDate ld = LocalDate.of(2021, 12, 3);
WeekFields wf = WeekFields.of(Locale.ENGLISH);
int weekNumber = ld.get(wf.weekOfWeekBasedYear());
java.time 做了很多奇妙的事情,其中??一件很棒的事情是它往往不會隱藏復雜的事情。例如,“一周什么時候開始”就無法回答,除非你告訴我你在地球上的哪個地方問這個問題。因此,“這一周是它是還沒有真正可以回答的問題,直到你告訴我到底我們使用一個星期計數系統,并沒有標準被普遍接受足夠。因此,您必須通過制作單獨WeekFields實體來捕獲該資訊的繁瑣步驟。我們在這里根據語言環境進行操作。
uj5u.com熱心網友回復:
實際上這不是特定的,Calendar因為如果在 12 月 29 日運行,這也會顯示第 1 周,例如:
System.out.println("Week: ${new SimpleDateFormat("w").format(new Date())}");
但它是 Java 7 特有的。它在 Java 8 中得到了修復。
我在這里找到了對此的解釋(正如@rzwitserloot 也解釋過的):
https://docs.oracle.com/javase/8/docs/api/java/util/GregorianCalendar.html
一周年與 WEEK_OF_YEAR 周期同步。第一周和最后一周(含)之間的所有周都具有相同的周年值。因此,一周年的第一天和最后一天可能具有不同的日歷年值。
例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 是 MONDAY 并且 getMinimalDaysInFirstWeek() 是 4(ISO 8601 標準兼容設定),那么 1998 的第 1 周從 1997 年 12 月 29 日開始,到 1998年 1 月 4 日結束。最后三天的周年是 1998 年1997 日歷年。但是,如果 getFirstDayOfWeek() 是 SUNDAY,則 1998 的第 1 周從 1998 年 1 月 4 日開始,到 1998 年 1 月 10 日結束;1998 年的前三天是 1997 年第 53 周的一部分,它們的年份是 1997 年。
這真的很有趣..
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/397097.html
