Java中的時間類型處理

在Java中,時間類型的應用一直叫我腦殼疼。
在計算(比較時間的先後、某一個時間節點的前後時間推算,如“最近一個週一是在幾月幾號”),這樣的問題,對於計算機(或者說代碼)來說,時間的計算就是以Unix元年開始的相對時間長度。Unix元年好比[數軸]上的[原點]。
而對於用戶(people)來說,當然是希望能夠看到類似於“2019-09-26”或者是“2019-09-26 08:08:08”這樣的東西。
矛盾點一:最終的顯示字符與程序中用於計算的變量不一致(不想int類型,可以用於計算,可用於直接打印顯示);
對於認真的程序員來說,日期(Date)與時間(Time)是不一樣的,就是“2019-09-26”與“2019-09-26 08:08:08”的差異。當然在任何系統中,它們的存儲類型和業務場景中代表的意義是不同的。員外我的生日就沒法精確到小時,更別說分鐘了(只是一個月黑風高夜)。
矛盾點二:精確度的要求;
那麼到目前爲止,大部分人使用過的,並且仍然在使用的日期(時間)java.util.Date,就讓員外腦殼很疼。因爲它就存在以上兩個矛盾點。
幸運的是,Java8開始,java.time的引入。LocalDate、LocalTime、LocalDateTime一些類型的引入。業務中具體需要使用的類型可以找到具體的java類型(如果還有啥糾結magic,那可能是因爲產品或者業務人員對某個時間、日期字段的定位不準)。

以下是幾個能經常用到的類型嘍:
LocalDate:簡單的日期,並不含當天的時間信息。也不附帶任何時區相關的信息。包含:年月日信息。

LocalDate date = LocalDate.of(2019,9,25); //參數類型(int,int,int)
LocalDate today = LocalDate.now();//default時區,當前日期

LocalTime:時分秒。

LocalTime time = LocalTime(11,6,50);//11:06:50
LocalTime nowTime = LocalTime.now();//當前時鐘時間

LocalDate和LocalTime支持字符串做爲參數實例化:

LocalDate date = LocalDate("2019-09-25");
LocalTime time = LocalTime("11:06:50");

LocalDateTime:LocalDate和LocalTime的合體,同時表示了日期和時間,但是不帶時區信息。可以直接創建,也可以通過合併
日期和時間對象構造。

LocalDateTime t1 = LocalDateTime.of(2019,Month.September,25,11,6,50);//2019-09-25 11:06:50
LocalDateTime t2 = date.atTime(time);//date append time 返回 LocalDateTime
LocalDateTime t3 = time.atDate(date);//date append time 返回 LocalDateTime

ZoneDateTime:代表了相對於指定時區的時間點

ZoneId romeZone = ZoneId.of("Asia/Shanghai");
ZoneDateTime d1 = date.atStartOfDay(romeZone);
ZoneDateTime d2 = t1.atZone(romeZone);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章