日期時間(JDK 8前)
提前說下,這些過時的類型跟方法實際95%用不上,了解一下就夠了
System
類中的currentTimeMillis()
:返回當下與1970年1月1日
之間的時間差,單位毫秒- 這一長串的數字稱為
時間戳
- 這一長串的數字稱為
java.util.Date類
-
創建
-
使用空參構造器:創建一個當前時間的物件,格式為
Wed Dec 01 13:35:20 CST 2021
-
形參傳入時間戳,創建一個該時間戳的物件
-
-
方法
toString()
:顯示時間getTime()
:返回時間戳
java.sql.Date類
- 本身是
java.util.Date
的子類,用來對應資料庫中的日期變量- 為了區分,最好使用全類名例如:
java.sql.Date d2 = new java.sql.Date(d1.getTime());
- 創建:形參必須傳入時間戳
- 方法:
toString()
:顯示時間,格式只有日期,如:2021-12-01
getTime()
:返回時間戳
- 為了區分,最好使用全類名例如:
java.util.Date
與java.sql.Date
轉換:形參中填入getTime()
即可互轉
SimpleDateFormat類
-
顧名思義,把Date類格式化成String用的
-
創建一個形參為你想要的格式(如常見的
yyyy-MM-dd hh:mm:ss
)的SimpleDateFormat
物件 -
用此物件調用
format(date物件)
方法返回想要的String
,舉例:Date d1 = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String s1 = sdf.format(d1); System.out.println("s1 = " + s1);
-
還原(解析)文字重回
Date
類,也要符合該物件生成時的格式,並且用try
包裹,舉例:try { Date d2 = sdf.parse(s1); System.out.println("d2 = " + d2); } catch (ParseException e) { e.printStackTrace(); }
Calendar類
-
日曆,用於找"今天是今年第幾天"之類的問題
-
本身是個抽象類,要調用時可選擇創建其子類
GregorianCalendar
的物件 -
或是更簡便的調用其靜態方法
getTnstance()
,舉例:Calendar ca = Calendar.getInstance(); int days1 = ca.get(Calendar.DAY_OF_YEAR); System.out.println("days1 = " + days1);
-
這個例子中,物件ca預設就是當前時間,然而他是可以被操作的,使用
set()
或add()
方法去改變其自身屬性,解決例如"n天後是今年第幾天"這種問題,但這個實在很怪,個人覺得使用場景不多 -
getTime()
:從日曆類轉成date類 -
setTime()
:從date類轉成日曆類,用於解決例如給一個日期"Wed Dec 01 16:49:56 CST 2021
“要你算出他是今年第幾天之類的問題 -
使用時注意,一月=0、二月=1…十二月=11,周日=1、周一=2…周六=7,簡直搞事
日期時間(JDK 8後)
前面那些實在缺點太多太難用,大家都用Joda-Time這個第三方時間包,後來就被官方收編成了
java.time
LocalDateTime
now()
:返回當前時間of(形參)
:設置指定的時間getXXX()
:獲取相對時間,例如當月的第幾日之類withXXX(形參)
:返回一個不可變的LocalDateTime
類物件,設置相對時間用,例如某年的5月plusXXX(時間)
:返回一個增加多久時間的LocalDateTime
類物件,例如今天買會員,3個月後過期minusXXX(時間)
:同上,減少
Instant
精準到納秒的時間類,跟
java.util.Date
類九成像
Instant.now()
:靜態方法,返回當前時間,根據UTC時區
atOffset(ZoneOffset.ofHour(8)
:返回一個offsetDateTime
類的物件,位於+8時區toEpochMilli()
:返回自1970開始的時間戳ofEpochMilli(時間戳)
:從時間戳創立物件
DateTimeFormatter
格式化,跟
SimpleDateFormat
類九成像
-
預設標準格式
ISO_XXX
-
本地化格式
ofLocalizedDateTime(FormatStyle)
-
ofPattern(自訂格式)
:靜態方法,返回一個DateTimeFormatter物件 -
format(時間物件)
:格式化 -
parse(string)
:還原
其他API
ZoneID
:時區Duration
:兩個時間間隔Period
:兩個日期間隔TemporalAdjusters
:該類通過靜態方法提供大量firstdayofxx
、nextXXX
之類的方法
Java比較器
只要涉及到物件要比較大小、排序就會用到這2個接口
Comparable
-
又稱自然排序,一般都是從低到高、小到大
-
像
String
、包裝類
等等已經內建實現了Comparable
接口,重寫了compareTo(obj)
方法,可以自然用Arrays.sort(欲排列數組)
方法排序 -
如果是一個自訂類,則需要手動實現重寫
compareTo(obj)
方法,舉例:// 指明排序方式,例如價格低到高 @Override public int compareTo(Object o) { if (o instanceof Goods) { Goods goods = (Goods) o; // 為了健壯性先強轉 // 基本寫法 if (this.price > goods.price) { return 1; } else if (this.price < goods.price) { return -1; } else { return 0; // 可以繼續比較其他條件,例如名稱 // return this.name.compareTo(goods.name); // 反著排加"-" return -this.name.compareTo(goods.name); } // 直接調用該數據類型的compare // return Integer.compare(this.price, goods.price); } throw new RuntimeException("傳入類型不一致"); }
-
優勢在於,我的類實現了此接口,創立出來的物件都可以比較排序了
Comparator
-
訂製排序,與
Comparable
不同之處在於Comparable
的方法A.compareTo(B)
是先需要一個當前類的物件A去跟B比較 -
而
Comparator
實現的方法是compare(obj1, obj2)
,常用匿名內部類實現,舉例:String[] arr = new String[]{"aa", "bb", "dd", "cc", "zz", "rr"}; Arrays.sort(arr, new Comparator<String>() { @Override public int compare(String o1, String o2) { // 可以在這邊自訂排序的規則,例如我想從z to a return -o1.compareTo(o2); } }); System.out.println(Arrays.toString(arr));
-
優勢:
- 用在比如自訂類不方便去實現
Comparable
接口的場合 - 直接在
Arrays.sort
形參後面加個”,“就可以非常方便一次性使用 - 可以用lambda表達式,例如:
Arrays.sort(arr, (o1, o2) -> 0);
,既優雅效率又高
- 用在比如自訂類不方便去實現
System類
- 位於
java.lang
包下 - 由於該類的構造器是private,所以無法創造物件
- 內部的成員變量或方法都是靜態的,可以直接調用
成員變量
System.in
:標準輸入流(鍵盤)System.out
:標準輸出流(螢幕)System.err
:標準錯誤輸出流(螢幕)
成員方法
currentTimemillis()
:返回時間戳exit(int status)
:退出程序,status
=退出代碼,0表示正常gc()
:呼叫垃圾車getProperty(String key)
:獲取一些系統訊息,key的舉例:user.name
返回使用者名稱
Math類
常用的數學相關、科學常數等等,操作的數據通常都是double型,舉例:
abs
:絕對值sqrt
:平方根random
:返回0.0~1.0隨機數- …有用到再去查即可
BigInteger類
- 用來表示不可變的、任意精度的整數,並支援大多數math相關方法,多大數字都能用它
BigDecimal類
- 用來表示不可變的、任意精度的有符號的十進制帶點數
- 跟錢有關的,大多數都採用這個
臨時複習
突然想到,發現有點搞不清了,趕緊再複習一次
- 重寫(
override
):繼承時,子類的形參、返回、異常類型以及權限範圍不能擴大,但可以有自己的處理方式;即外殼不變、內容改寫 - 重載(
overload
):同一類中,同樣的方法名可以存在多個,只要他們參數不同,調用時會自己套用到對應的;最常見於構造器
小結
- 關於時間,想要本地時間
LocalDateTime
,想要格式化用DateTimeFormatter
- 物件想比較或排序,用
Comparator
上次修改於 2021-12-06