獨(dú)立站和企業(yè)網(wǎng)站區(qū)別網(wǎng)絡(luò)技術(shù)培訓(xùn)
1. JDK7-Date類
我們先來看時(shí)間的相關(guān)知識(shí)點(diǎn)
-
世界標(biāo)準(zhǔn)時(shí)間:
格林尼治時(shí)間/格林威治時(shí)間(Greenwich Mean Time)簡稱GMT。目前世界標(biāo)準(zhǔn)時(shí)間(UTC)已經(jīng)替換為:原子鐘
-
中國標(biāo)準(zhǔn)時(shí)間: 世界標(biāo)準(zhǔn)時(shí)間+8小時(shí)
時(shí)間單位換算:
-
1秒=1000毫秒
-
1毫秒=1000微秒
-
1微秒=1000納秒
Date類
Date類是一個(gè)JDK寫好的Javabean類,用來描述時(shí)間,精確到毫秒。
- 利用空參構(gòu)造創(chuàng)建的對象,默認(rèn)表示系統(tǒng)當(dāng)前時(shí)間。
- 利用有參構(gòu)造創(chuàng)建的對象,表示指定的時(shí)間。
我們給出一些常用的方法和構(gòu)造方法:
- 構(gòu)造方法
方法 | 說明 |
---|---|
public Date() | 創(chuàng)建Date對象,表示當(dāng)前時(shí)間 |
public Date(long date) | 創(chuàng)建Date對象,表示指定時(shí)間 |
- 成員方法
方法 | 說明 |
---|---|
public void setTime(long time) | 設(shè)置/修改毫秒值 |
public long getTime() | 獲取時(shí)間對象的毫秒值 |
代碼示例:
Date d1 = new Date();
System.out.println(d1);
//表示一個(gè)指定的時(shí)間
Date d2 = new Date(1000L);
System.out.println(d2);
//設(shè)置一個(gè)時(shí)間
d2.setTime(1000L);//從時(shí)間原點(diǎn)開始設(shè)置
System.out.println(d2);
//獲取當(dāng)前時(shí)間的毫秒值
long time = d2.getTime();//返回值為long類型
System.out.println(time);
輸出結(jié)果為:
這里給上其他例子:
- 獲取時(shí)間原點(diǎn)一年以后的時(shí)間
- 隨機(jī)創(chuàng)建兩個(gè)時(shí)間對象并比較
代碼示例:
System.out.println("--------------------");
//時(shí)間原點(diǎn)一年以后的時(shí)間
long time1 = 1000L * 60 * 60 * 24 * 365;
Date d3 = new Date(time1);
System.out.println(d3);
System.out.println("--------------------");
//獲取兩個(gè)隨機(jī)時(shí)間
Random r = new Random();
Date d4 = new Date(Math.abs(r.nextInt()));
Date d5 = new Date(Math.abs(r.nextInt()));
System.out.println(d4);
System.out.println(d5);
//時(shí)間的比較使用gettime方法即可
2. JDK7-SimpleDateFormat類
這個(gè)類主要有兩個(gè)作用:
- 把時(shí)間變成我們想要的格式
- 把字符串表示的時(shí)間變成Date對象
下面我們介紹構(gòu)造方法和常用的成員方法:
#構(gòu)造方法
public SimpleDateFormat() : 默認(rèn)格式
public SimpleDateFormat(String pattern) : 指定格式
#成員方法
public final String format(Date date) : 格式化(日期對象->字符串)
public Date parse(String source) : 解析(字符串->日期對象)
public SimpleDateFormat(String pattern)
中的pattern
是這個(gè)類的一個(gè)成員變量,表述時(shí)間的格式。
- 如果使用空參構(gòu)造那么格式化的時(shí)候就會(huì)是:年/月/日/ 上午/下午 時(shí):分:秒
- 使用帶參數(shù)構(gòu)造方法:傳入格式
傳入的格式:(常用格式-來自黑馬程序員)
代碼示例:
//1.利用空參構(gòu)造創(chuàng)建SimpleDateFormat對象,默認(rèn)格式
SimpleDateFormat sdf1 = new SimpleDateFormat();
Date d1 = new Date(OL);
String str1 = sdf1.format(d1);|
System.out.println(str1);//1970/1/1 1:48:00
//2.利用帶參構(gòu)造創(chuàng)建SimpleDateFormat對象,指定格式
SimpleDateFormat sdf2 = new SimpleDateFormat(pattern:"yyyy|MM]ddHH:mm:ssEE");
String str2 = sdf2.format(d1);
System.out.println(str2);//1970年01月01日 08:00:00
parse(String source)
: 字符串->時(shí)間對象
//1.定義一個(gè)字符串表示時(shí)間
String str = "2023-11-11 11:11:11";
//2.利用空參構(gòu)造創(chuàng)建SimpleDateFormat對象
//細(xì)節(jié):
//創(chuàng)建對象的格式要跟字符串的格式完全一致
SimpleDateFormat sdf = new SimpleDateFormat( pattern: "yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
//3.打印結(jié)果
System.out.println(date.getTime());//1699672271000
3.JDK7-Calendar類
Calendar
代表了系統(tǒng)當(dāng)前時(shí)間的日歷對象,可以單獨(dú)修改、獲取時(shí)間中的年,月,日
細(xì)節(jié):Calendar是一個(gè)抽象類,不能直接創(chuàng)建對象。
獲取Calendar
日歷類對象的方法
public static Calendar getInstance() 獲取當(dāng)前時(shí)間的日歷對象的子類對象
常用方法:
方法名 | 說明 |
---|---|
public final Date getTime() | 獲取日期對象 |
public final setTime(Date date) | 給日歷設(shè)置日期對象 |
public long getTimeInMillis() | 拿到時(shí)間毫秒值 |
public void setTimeInMillis(long millis) | 給日歷設(shè)置時(shí)間毫秒值 |
public int get(int field) | 取日歷中的某個(gè)字段信息 |
public void set(int field, int value) | 修改日歷的某個(gè)字段信息 |
public void add(int field, int amount) | 為某個(gè)字段增加/減少指定的值 |
- 獲取日歷對象
- 細(xì)節(jié): Calendar是一個(gè)抽象類,不能直接new,而是通過一個(gè)靜態(tài)方法獲取到子類對象
- 會(huì)根據(jù)系統(tǒng)的不同時(shí)區(qū)來獲取不同的日歷對象,默認(rèn)表示當(dāng)前時(shí)間。
- 把會(huì)把時(shí)間中的紀(jì)元,年,月,日,時(shí),分,秒,星期,等等的都放到一個(gè)數(shù)組當(dāng)中
Calendar c = Calendar.getInstance();
- 修改一下日歷代表的時(shí)間
Date d = new Date(OL);
c.setTime(d);
System.out.println(c);
3.get(int field)
首先我們要知道在日歷對象數(shù)組中數(shù)字的意義:
- 月份:范圍0~11 如果獲取出來的是0.那么實(shí)際上是1月。
- 星期: 數(shù)字表示略有不同
- 1(星期日)
- 2(星期一)
- 3(星期二)
- 4(星期三)
- 5(星期四)
- 6(星期五)
- 7(星期六)
方法的參數(shù)field
值為:0,1,2,3,4,5,6,,,16
其中:
- 0 - 紀(jì)元
- 1 - 年
- 2 - 月
- 3 - 一年中的第幾周
- 4 - 一個(gè)月中的第幾周
- 5 - 一個(gè)月中的第幾天
- …
代碼示例:
Calendar c = Calendar.getInstance();
System.out.println(c);
System.out.println(c.get(1) + "年" + (c.get(2) + 1) + "月" + c.get(5) + "日");
輸出結(jié)果為:2024年11月29日
注意:這里月份加一:
(c.get(2) + 1)
set(int field, int value)
和add(int field, int amount)
使用獲取的日歷對象調(diào)用
在set
方法中,field 表示的和上面get
方法中的 field一樣
后面value表示要修改的值
在add
方法中field表示和上述相同,amount表示要增加或者刪去的數(shù)。
- 要注意的時(shí)月份在編譯器中的范圍是:0-11
- amount為正數(shù)表示增加,為負(fù)數(shù)表示減少
3.JDK8相關(guān)時(shí)間類
a.為什么要學(xué)習(xí)JDK8的時(shí)間類
- JDK8 的時(shí)間類相比于JDK7 在代碼上更為簡潔和方便
- 更為的安全,JDK8的時(shí)間日期對象都是不可變的,解決了多線程環(huán)境下導(dǎo)致的環(huán)境安全問題
b.JDK8時(shí)間相關(guān)類的分類
我們按照對比JDK7時(shí)間類的方法進(jìn)行分類:
- 和JDK7中的
Date
類相照應(yīng):ZoneId
:時(shí)區(qū)Instant
:時(shí)間戳ZoneDateTime
:帶時(shí)區(qū)的時(shí)間
- 和
SimpleDateFormat
相對應(yīng)DateTimeFormatter
:用于時(shí)間格式化和解析
- 和
Calendar
類相對應(yīng)LocalDate
:年、月、日LocalTime
:時(shí)、分、秒LocalDateTime
:年、月、日、時(shí)、分、秒
- 工具類
Duration
: 用于計(jì)算兩個(gè)“時(shí)間”間隔(秒,納秒)Period
: 用于計(jì)算兩個(gè)“日期”間隔(年、月、日)ChronoUnit
: 用于計(jì)算兩個(gè)“日期”間隔(使用范圍更廣,要熟練掌握)
c.類的成員方法
-
ZoneId
static Set<String> getAvailableZoneIds()———獲取Java中支持的所有時(shí)區(qū)static ZoneId systemDefault()———獲取系統(tǒng)默認(rèn)時(shí)區(qū)static ZoneId of(String zoneId)——獲取一個(gè)指定時(shí)區(qū)
代碼示例:
//獲取所有時(shí)區(qū)
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
System.out.println(zoneIds);
//獲取當(dāng)前系統(tǒng)默認(rèn)時(shí)區(qū)
ZoneId systemDefault = ZoneId.systemDefault();
System.out.println(systemDefault);
//獲取一個(gè)指定時(shí)區(qū)
ZoneId of = ZoneId.of("US/Indiana-Starke");
System.out.println(of);
值得注意的是getAvailableZoneIds()
的返回類型是一個(gè)集合,這個(gè)集合的泛型式String
當(dāng)然對于第二個(gè)默認(rèn)時(shí)區(qū)我們可以在電腦的設(shè)置上進(jìn)行修改
- 時(shí)間戳
Instant
時(shí)間戳獲取的式標(biāo)準(zhǔn)時(shí)間不帶時(shí)區(qū)
方法 | 說明 |
---|---|
static Instant now( ) | 獲取當(dāng)前時(shí)間的Instant對象(標(biāo)準(zhǔn)時(shí)間) |
static Instant ofXxxx(long epochMilli) | 根據(jù)(秒/毫秒/納秒)獲取Instant對象 |
ZonedDateTime atZone(ZoneId zone) | 指定時(shí)區(qū) |
boolean isXxx(Instant otherInstant) | 判斷系列的方法 |
Instant minusXxx(long millisToSubtract) | 減少時(shí)間系列的方法 |
Instant plusXxx(long millisToSubtract) | 增加時(shí)間系列的方法 |
上面的
Xxxx
表示這個(gè)方法有很多的不同的類型
我們給出代碼示例:
Instant now = Instant.now();
System.out.println(now);
//根據(jù)傳入的時(shí)間獲取對象(相對于時(shí)間原點(diǎn))
Instant instant = Instant.ofEpochMilli(1000L);
Instant instant1 = Instant.ofEpochSecond(1L);
Instant instant2 = Instant.ofEpochSecond(1L, 1000000000L);
System.out.println(instant);
System.out.println(instant1);
System.out.println(instant2);
//獲取指定時(shí)區(qū)的時(shí)間戳
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
//1.返回類型式zonedDateTime
//2.需要Instant對象調(diào)用
//3.傳入的參數(shù)式zoneId類型的時(shí)區(qū)
System.out.println(zonedDateTime);
//判斷時(shí)間前后
boolean after = instant.isAfter(instant1);
boolean before = instant.isBefore(instant2);
System.out.println(after);
System.out.println(before);
//減少時(shí)間
Instant instant3 = instant.minusSeconds(1L);
System.out.println(instant);
System.out.println(instant3);
ZoneDateTime
:帶時(shí)區(qū)的時(shí)間
方法:
方法 | 說明 |
---|---|
static ZonedDateTime now() | 獲取當(dāng)前時(shí)間的ZonedDateTime對象(帶時(shí)區(qū)) |
static ZonedDateTime ofXxxx( ) | 獲取指定時(shí)間的ZonedDateTime對象(帶時(shí)區(qū)) |
ZonedDateTime withXxx(時(shí)間) | 修改時(shí)間系列的方法 |
ZonedDateTime minusXxx(時(shí)間) | 減少時(shí)間系列的方法 |
ZonedDateTime plusXxx(時(shí)間) | 增加時(shí)間系列的方法 |
需要我么注意的是有一個(gè)和Instant
搭配的用法,我們前面也講過:
//獲取指定時(shí)區(qū)的時(shí)間戳
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
//1.返回類型式zonedDateTime
//2.需要Instant對象調(diào)用
//3.傳入的參數(shù)式zoneId類型的時(shí)區(qū)
System.out.println(zonedDateTime);
同時(shí)修改時(shí)間的方法可以針對性的修改年份、月份、時(shí)、秒等
Instant
和ZoneDateTime
都是時(shí)間對象,主要區(qū)別在于前者時(shí)獲取標(biāo)準(zhǔn)時(shí)間對象,后者表示帶時(shí)區(qū)的時(shí)間對象
DateTimeFormatter
:用于時(shí)間格式化和解析
方法 | 說明 |
---|---|
static DateTimeFormatter ofPattern(格式) | 獲取格式對象 |
String format(時(shí)間對象) | 按照指定方式格式化 |
代碼示例:
//獲取時(shí)間對象
ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
// 解析/格式化器
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm: ss EE a");
// 格式化
System.out.println(dtf1.format(time));
LocalDateTime
及相關(guān)
方法名 | 說明 |
---|---|
static XXX now() | 獲取當(dāng)前時(shí)間的對象 |
static XXX of(. . . ) | 獲取指定時(shí)間的對象 |
get開頭的方法 | 獲取日歷中的年、月、日、時(shí)、分、秒等信息 |
isBefore, isAfter | 比較兩個(gè) LocalDate |
with開頭的 | 修改時(shí)間系列的方法 |
minus開頭的 | 減少時(shí)間系列的方法 |
plus開頭的 | 增加時(shí)間系列的方法 |
同時(shí)LocalDateTime
可以轉(zhuǎn)換成LocalDate
和LocalTime
方法:
方法名 | 說明 |
---|---|
public LocalDate toLocalDate() | LocalDateTime轉(zhuǎn)換成一個(gè)LocalDate對象 |
public LocalTime toLocalTime() | LocalDateTime轉(zhuǎn)換成一個(gè)LocalTime對象 |
4.包裝類
a.什么是包裝類
包裝類是基本數(shù)據(jù)類型對應(yīng)的引用數(shù)據(jù)類型(對象)
使用包裝類是為了數(shù)據(jù)的統(tǒng)一,因?yàn)橹挥幸脭?shù)據(jù)類型才能使用集合,也只有類才可以使用Object
來接收數(shù)據(jù)
public void show(Object obj){//代碼
}
實(shí)際上內(nèi)存原理是:
- 使用一個(gè)類的成員變量來記錄數(shù)值
- 操作數(shù)據(jù)的方法
內(nèi)存圖:
b. 包裝類的分類
基本數(shù)據(jù)類型 | 包裝類 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
只有int和char的包裝類命名比較特殊,其他都是首字母大寫
c.創(chuàng)建一個(gè)包裝類對象
1.JDK5之前的創(chuàng)建方法
方法 | 說明 |
---|---|
public Integer(int value) | 根據(jù)傳遞的整數(shù)創(chuàng)建一個(gè)Integer對象 |
public Integer(String s) | 根據(jù)傳遞的字符串創(chuàng)建一個(gè)Integer對象 |
public static Integer valueOf(int i) | 根據(jù)傳遞的整數(shù)創(chuàng)建一個(gè)Integer對象 |
public static Integer valueOf(String s) | 根據(jù)傳遞的字符串創(chuàng)建一個(gè)Integer對象 |
public static Integer valueOf(String s, int radix) | 根據(jù)傳遞的字符串和進(jìn)制創(chuàng)建一個(gè)Integer對象 |
上面的方法中兩個(gè)構(gòu)造方法和三個(gè)靜態(tài)方法,我們介紹它們的區(qū)別
Integer i1 = new Integer(1);
Integer i2 = new Integer("2");
//
Integer i3 = Integer.valueOf(1);
Integer i4 = Integer.valueOf("3");
Integer i5 = Integer.valueOf("123", 8);
System.out.println(i1);
System.out.println(i2);
System.out.println("---------------");
System.out.println(i3);
System.out.println(i4);
System.out.println(i5);
- 在Java內(nèi)部對
valueof
進(jìn)行了優(yōu)化,傳入的數(shù)值在-128 ~ 127之間時(shí)會(huì)返回一個(gè)固定的對象,對象的地址值是固定的 - 而使用構(gòu)造方法
new
是一定會(huì)創(chuàng)建一個(gè)新的對象
當(dāng)然這都是過時(shí)的方法,現(xiàn)在不常用了
2. 當(dāng)前創(chuàng)建包裝類對象
我們使用上述的方法創(chuàng)建的包裝類在進(jìn)行運(yùn)算的時(shí)候比較麻煩需要經(jīng)歷以下步驟:
- 把包裝類轉(zhuǎn)換為基本數(shù)據(jù)類型
- 使用基本數(shù)據(jù)類型進(jìn)行運(yùn)算
- 把運(yùn)算的結(jié)果轉(zhuǎn)換為包裝類型
在JDK5之后,Java做了優(yōu)化,把上述的過程直接在底層實(shí)現(xiàn)了。我們可以直接使用包裝類進(jìn)行賦值
Integer i = 10;
Integer j = 11;
Integer sum = i + j;
d.Integer類成員方法詳解
方法 | 說明 |
---|---|
public static String toBinaryString(int i) | 得到二進(jìn)制 |
public static String toOctalString(int i) | 得到八進(jìn)制 |
public static String toHexString(int i) | 得到十六進(jìn)制 |
public static int parseInt(String s) | 將字符串類型的整數(shù)轉(zhuǎn)成int類型的整數(shù) |
前面三種方法的返回值都是String
類型,原因:
- 用基本數(shù)據(jù)類型長度可能不夠
- 返回二進(jìn)制時(shí)候返回的值可能是負(fù)數(shù)。例如:01101,但是基本數(shù)據(jù)類型0不可以作為開頭
這里詳細(xì)講一下字符串轉(zhuǎn)換:
int i = Integer.parseInt( s: "123");
System.out.println(i);
System.out.println(i + 1);//124
String str = "true";
boolean b = Boolean.parseBoolean(str);
System.out.println(b);
java是一種強(qiáng)類型語言(每種數(shù)據(jù)在java中都有各自的數(shù)據(jù)類型)在計(jì)算的時(shí)候,如果不是同一種數(shù)據(jù)類型,是無法直接計(jì)算的。
值得注意的是parseInt(String s)
的兩點(diǎn):
- 在類型轉(zhuǎn)換的時(shí)候,括號(hào)中的參數(shù)只能是數(shù)字不能是其他,否則代碼會(huì)報(bào)錯(cuò)
- 8種包裝類當(dāng)中,除了Character都有對應(yīng)的parseXxx的方法,進(jìn)行類型轉(zhuǎn)換
e.鍵盤錄入nextLine
我們之前使用Scanner
對象進(jìn)行鍵盤錄入的時(shí)候會(huì)有一點(diǎn)的弊端:
- 比如:nextInt, nextDouble, next等
- 在進(jìn)行錄入的時(shí)候如果遇到空格, 回車,制表符時(shí)候就停止了
所以在以后我們建議使用nextLine
:可以錄入一整行的數(shù)據(jù),遇到回車停止
- 返回值是
String
類型 - 可以使用類型轉(zhuǎn)換的方法,把錄入的
String
類型的數(shù)據(jù)轉(zhuǎn)換為我們需要的數(shù)據(jù)
代碼示例:
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入一個(gè)字符串");
String s = scanner.nextLine();
int i = Integer.parseInt(s);
System.out.println(i);