簡介:
用於日期的計算。
是乙個抽象類,得用它的靜態方法getinstance()獲取(它的子類)例項。(會根據地區的不同建立當地使用的日曆)
將年月日等都存在了它的乙個private陣列裡:fields。
年在該陣列的下標存在了public static欄位year裡,以此類推。
具體:
// set 設定某字段的值
// get 獲取某字段的值
// add 增加某字段的值
// gettime 獲取日曆時間 表示的 date物件
// gettimeinmillis 獲取用毫秒數表示的日曆時間
// settime(date); 用date物件給日曆時間賦值
// getactualmaximum 獲取某字段的最大值
calendar cl = calendar.
getinstance()
;//建立時間為當前時間的日曆
system.out.
println
(cl.
get(calendar.year));
system.out.
println
(cl.
get(calendar.month));
cl.set
(calendar.month,1)
;cl.
add(calendar.month,-4
);date d = cl.
gettime()
;system.out.
println
(cl.
get(calendar.year));
system.out.
println
(cl.
get(calendar.month));
int m = cl.
getactualmaximum
(calendar.day_of_month)
;system.out.
println
(m);
執行結果:
2020
112019
931
一些意料之外的細節:
格列高利月曆的month是0 到 11!(中國預設格列高利月曆,即公曆)(其他欄位從1開始,不含0)
calendar.hour預設是按12小時制處理,calendar.hour_of_day才是24小時。
day_of_week,星期日對應的是1,星期六才是7。
易錯點:
calendar calendar1 = calendar.
getinstance()
;calendar calendar2 = calendar.
getinstance()
;//比calendar1晚了幾毫秒
calendar2.
set(calendar.day_of_month,2)
;calendar2.
set(calendar.day_of_month,1)
;//設定calendar2比calendar1早了一天
//計算calendar1\calendar2差了幾天
long deltadays =
(calendar1.
gettimeinmillis()
-calendar2.
gettimeinmillis()
)/1000/60
/60/24
;int days =
(int
) deltadays;
system.out.
println
(days)
;
實際輸出:
0
錯誤原因分析:
這是由於calendar2初始化晚於calendar1造成的。
從ms精度上來講,calendar1-calendar2=一天-幾毫秒<1天,整除1000x60x60x24後 等於 0.
(如果倒過來calendar1的日期比calendar2早,就不影響calendar1-calendar2的結果了,只會影響calendar2-calendar1的結果)
修改方法:
long deltadays =
(calendar1.
gettimeinmillis()
-calendar2.
gettimeinmillis()
)/1000/60
/60/24
;int days =
(int
) deltadays;
if(calendar1.
after
(calendar2)
)
ps:如果這裡days的計算方式如下,也會造成錯誤int days =
(int
)(calendar1.
gettimeinmillis()
-calendar2.
gettimeinmillis()
)/1000/60
/60/24
;
錯誤原因:
強制型別轉換優先順序比除法高,會先將gettimeinmillis()方法返回的long型別數字截斷成為int,此處造成高置位不為0數字喪失。
解決方法:
在整個計算式外面加乙個"()",改變計算優先順序。由於整除後得到的數字不大於2
162^
216,故強制型別轉換不會造成數值變化。
面試易錯點
一 char str1 abc char str2 abc char str3 abc char str4 abc str1和str2是不相同的,str3和 str4是相同的,str1和str2是儲存在堆上,str3和 str4在常量區,這兩個指標指向的是同一位址 編譯器認為p1指向的 abc 和p...
總結 易錯點
題目要求是 結尾,我使用了str 1 str 2 single line containing only marks the end of a test case.題目給的是 f1 1 f2 2 fn fn 1 fn 2 n 3 我卻從f0開始推,並且迴圈跟著從0開始了 題目可能會出現一道腦筋急轉彎...
陣列易錯點
1.初始化定義 1.int n 常量表示式 常量表示式不能為變數 2.int main 內與int main 外的陣列初始化定義有區別 int main 內初始化為隨機,int main 外初始化值為0 2.資料範圍 a i 的i範圍不能超過常量表示式中的範圍 典型的陣列越界 3.陣列不能夠進行賦值...