Calendar類要點 易錯點

2021-10-13 12:38:04 字數 2792 閱讀 2426

簡介:

用於日期的計算。

是乙個抽象類,得用它的靜態方法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.陣列不能夠進行賦值...