日期操作是日常開發中繞不開的一環,Java 8之前使用Date API,Java 8之後推薦使用LocalDate API。
Java 8之前的日期操作
在Java 8之前,主要使用Date、Calendar、SimpleDateFormat來操作日期,不得不說習慣了.NET中的DateTime之後,再用這套API來操作日期,就一個評價:“爛”的“遙遙領先”。
Date
Java中表示日期和時間的類,一般用於獲取當前的日期和時間。
- new Date():表示的就是當前日期。
- toString():當前日期按文本格式輸出,格式類似於這樣:
Wed Apr 03 09:59:51 CST 2024
。 - after():日期比較,還有一個before()函數,用於判斷日期在當前日期之前還是之後。
- getYear():你認爲他返回的是年份,其實他返回的是當前年份-1900年,比如2024返回的就是124,你以爲這就完了,getMonth()居然是從0開始的,也就是說現在是4月,他的返回值就是3,所以爲啥Java的學習氛圍比.NET的好,一個小小的日期操作,就讓我學到了要知其然更要知其所以然,尤其不能想當然。
- getTime():返回一個UNIX時間戳,即1970年1月1日以來的毫秒數。
SimpleDateFormat
很明顯,toString()這種東西是無法滿足日常的格式化輸出需求的,這個時候我們就需要用到SimpleDateFormat,比如我們常見的格式化yyyy-MM-dd HH:mm:ss
輸出。
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
還有常見的字符串轉日期操作:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frd = "1949-10-01 03:00:00";
Date date = sdf.parse(frd);
Calendar
項目中也經常要用到日期計算,Date稍有些力不從心,這時就需要Calendar,來處理日期和時間的計算。
- getInstance():Calendar是一個抽象類,不能直接實例化。
- set():可以設置年份,月份、日期等,如
calendar.set(2023,Calendar.FEBRUARY,28)
,當然你也可以通過calendar.set(Calendar.YEAR,2023)
來單獨設置。 - add():日期的加減操作了,比如
calendar.add(Calendar.DAY_OF_MONTH,1)
。 - getTime():Calendar對象轉Date。
- setTime(): Date對象轉Calendar。
Java 8之後的日期操作
估計也是受夠了老式API,Java 8的對日期操作做了全新改進,我們可以通過java.time下的LocalDate、LocalDate、LocalDateTime、DateTimeFormatter等來處理日期和時間。
LocalDate
日期操作類,提供了各種方法來操作日期。
LocalDate.now(); //當前日期
LocalDate.of(1949, 10, 1); //指定日期
LocalDate.parse("1949-10-01"); //日期轉換
LocalDate.now().getYear(); //獲取年 就是當前年
LocalDate.now().getMonthValue(); //返回月 就是當月
LocalDate.now().getDayOfMonth(); //返回日 就是當日
LocalTime
時間操作類,不包含日期,包括小時、分鐘、秒和毫秒。
LocalTime.now(); //獲取當前時間如:13:24:25.479
LocalTime.of(13, 30, 0);//指定時間
LocalTime.now().getHour(); //獲取小時
LocalTime.now().getMinute(); //獲取分鐘
LocalTime.now().getSecond(); //獲取秒
LocalDateTime
表示日期和時間,已經很接近.NET中的DateTime了,也是處理日期和時間的主要類之一。
LocalDateTime.now(); //獲取當前日期和時間
LocalDateTime.of(1949, 10, 1, 15, 0); //創建指定日期和時間
LocalDateTime.parse("1949-10-01T15:00:00"); //日期轉換,注意這個T是必須的
LocalDateTime.parse("1949-10-01 15:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); //固定格式轉換
Duration
對標.NET中的TimeSpan。
LocalDateTime now = LocalDateTime.now();
LocalDateTime born = LocalDateTime.of(1949, 10, 1, 15, 0);
Duration duration = Duration.between(born, now); //計算日期差,可以精確到納秒
long day = duration.toDays();