摘要:在設置或獲得或字段時,必須確定一個月或一年的第一個星期,以此作為參考點。一個月或一年的第一個星期被確定為開始于的最早七天,它最少包含那一個月或一年的天數。例如,特定子類可能將某一年第個星期之前的那個星期指定為前一年的第個星期。
Calendar工具類解釋
首先解釋下Calendar工具類的作用。根據API的解釋,Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日歷字段之間的轉換提供了一些方法,并為操作日歷字段(例如獲得下星期的日期)提供了一些基礎方法,其中瞬間可用毫秒值來表示,它是距歷元(即格林威治標準時間 1970 年 1 月 1 日的 00:00:00.000,格里高利歷)的偏移量。
那么Calendar工具類是如何界定跨年或者跨月份的星期定義呢?舉個例子:
如上圖所示,2020年1月1日是星期三,那么它是算2020年的第一周呢還是2019年的最后一周?諸如如此的跨年份或者跨月份導致星期界定不明的情況,Calendar工具類提供了兩個方法去個性化定義此類問題,一個方法是getFirstDayOfWeek(),另一個方法是getMinimalDaysInFirstWeek(),這兩個方法相輔相成,共同完成對此類問題的定義。下面對這兩個方法進行詳細介紹。
getFirstDayOfWeek()和getMinimalDaysInFirstWeek()方法getFirstDayOfWeek()方法官方API是這么解釋的:獲取一星期的第一天。而getMinimalDaysInFirstWeek()方法官方API是這么定義的:獲取一年中第一個星期所需的最少天數。那么這兩個方法是如何共同定義的呢?先放官方api解釋:
Calendar 使用兩個參數定義了特定于語言環境的 7 天制星期:星期的第一天和第一個星期中的最小一天(從 1 到 7)。 這些數字取自構造 Calendar 時的語言環境資源數據。還可以通過為其設置值的方法來顯式地指定它們。 在設置或獲得 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段時,Calendar 必須確定一個月或一年的第一個星期,以此作為參考點。 一個月或一年的第一個星期被確定為開始于 getFirstDayOfWeek() 的最早七天,它最少包含那一個月或一年的 getMinimalDaysInFirstWeek() 天數。 第一個星期之前的各星期編號為 ...、-1、0;之后的星期編號為 2、3、...。注意,get() 返回的標準化編號方式可能有所不同。 例如,特定 Calendar 子類可能將某一年第 1 個星期之前的那個星期指定為前一年的第 n 個星期。
是不是感覺一頭霧水?那么接下來通過幾個例子就能簡單明了解釋他倆各自產生的效果了。
首先我們定義一星期的第一天為周一(MONDAY),然后要求一年的第一周必須要6天,即如下所示:
那么對于2020年1月1號而言,因為定義了一周開始是周一,那么1月1號所在的周為20191230-20200105這個星期,然后我們又規定了一年的第一周至少6天才能算該年第一周,但是在20191230-20200105這個星期內,只有12345號在2020年,共5天不滿足條件,因此2020年1月1號將歸屬于2019年的最后一周而不是2020年的第一周,運行結果如下所示:
那么如果我們把getMinimalDaysInFirstWeek()方法的參數改為5天而一星期的開始仍未周一呢?也就是說一年的第一周至少5天,由日歷可知,20191230-20200105這個星期內,12345號都在2020年,即滿足了getMinimalDaysInFirstWeek()方法的條件,因此此時2020年1月1號將被歸屬到2020年的第一周,運行結果如下:
同理,我們修改一下一周開始的時間,規定為一周開始時間是周日(SUNDAY),那么2020年1月1號在20191229-20200104這個星期內,getMinimalDaysInFirstWeek()參數我們不變仍未之前的5天,那么由日歷可知,在20191229-20200104這個星期內,只有1234號這四天在2020年,不滿足至少5天的條件,因此此時2020年1月1號將被劃分到2019年的最后一周,結果如下:
那么如果說一周開始是周日的話怎么修改才能讓2020年1月1號算在2020年的第一周呢?只需要規定一年的第一周至少4天即可,也就是getMinimalDaysInFirstWeek()方法的參數小于4就行了,我們將參數改為4,運行結果如下:
果然2020年1月1號歸屬到2020年第一周去了。
參數細節getFirstDayOfWeek()方法的參數是周一到周日沒什么問題,但是getMinimalDaysInFirstWeek()的參數范圍又是多少呢?正常按照我們的理解參數范圍1-7都是很好理解的,但是當參數不在這個范圍內又會發生什么?首先我們將參數規定為8看看會發生什么,一周開始定為周一。
對于2020年1月1號,自然不滿足條件,只能被歸屬到2019年最后一周,但是若是2020年1月6號呢?它屬于20200106-20200112這個星期,但是跨年的那個星期按照我們的理解只有5天是小于我們規定的8天的,因此它屬于一年的第一周?運行結果:
符合我們的期望,轉念一想其實就明白了,參數為8時跨年的那周永遠不滿足條件,第一周只會順延到跨年那周的下一周,因此我們可以認為getMinimalDaysInFirstWeek()的參數大于8是沒有意義的。
那么如果小于1又會如何?我們將參數定義為0試試:
沒問題,符合我們的期望,如果說負數呢?
仍未第一周,因此我們可以總結一下getMinimalDaysInFirstWeek()參數的范圍為0-7,超出這個范圍的參數無意義。
方法細節(重要!)對于getMinimalDaysInFirstWeek()和getFirstDayOfWeek()方法,并不是說設置了這兩個方法的值之后,就能取到你所設置的值的日期,例如你定義一周開始是周一,如果是當前是周一的話,通過get (Calendar.DAY_OF_WEEK)你認為就能取到1,但是測試發現結果仍然為2,因為默認一周開始就是周日(1)。那么難道說我這個設置一周開始為周一沒有生效?
其實并不是這樣,對于這兩個方法而言,當你在這兩個方法設置了參數時,只能對WEEK_OF_MONTH 與WEEK_OF_YEAR 生效,即當你想要獲取當前日期對象在當前月份是第幾周或者當前年份第幾周時才會生效,就正如本文前面所打印的結果一樣,只會對WEEK_OF_MONTH 與WEEK_OF_YEAR起作用。
getMinimalDaysInFirstWeek()和getFirstDayOfWeek()方法其實是相輔相成的,因此當我們需要自定義跨年星期的時候最好是兩個方法的參數都設置一下,這樣對于程序而言更為嚴謹。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70248.html
摘要:中提供了一個和的模塊可以用來做格式化日期和時間的。格式化日期通過模塊中方法來格式化日期函數接收時間元組并返回以可讀字符串表示薪資的時間格式的話由參數決定。每日寬度間隔為字符每行的長度為是每星期的行數。 我們可以通過學習在Python中對日期時間的處理,可以在快速的完成工作,比如: 將日期時間作為日志信息的內容輸入 計算某一個功能的執行時間 用日期命名一個文件的名稱 記錄或者展示文件的...
摘要:正則表達式的概述和簡單使用正則表達式是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。例如,在表達式中,存在四個這樣的組組零始終代表整個表達式。 1_正則表達式的概述和簡單使用 A:正則表達式 是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。其實就是一種規則。有自己特殊的應用。 作用:比如注冊郵箱,郵箱有用戶名和密碼,一般會對其限制長度,這個...
摘要:用了一段時間的開發項目,也是第一次用來開發項目,所有有許多相關的知識點需要總結,本文所介紹的的日期時間處理就是最近用到的,希望對各位有所幫助,也同時作為自己的筆記儲存。提供了等模塊用于處理日期和時間,較為常用的還是模塊。 用了一段時間的django開發web項目,也是第一次用python來開發項目,所有有許多相關的知識點需要總結,本文所介紹的python的日期時間處理就是最近用到的,希...
閱讀 3510·2021-11-25 09:43
閱讀 1266·2021-09-08 09:45
閱讀 2643·2021-09-07 09:59
閱讀 1502·2021-08-09 13:45
閱讀 3339·2019-08-30 15:54
閱讀 696·2019-08-29 18:35
閱讀 513·2019-08-29 17:18
閱讀 992·2019-08-29 14:10