主頁 > 後端開發 > Java 8新的時間日期庫,這二十個案例看完你還學不會算我的!!!

Java 8新的時間日期庫,這二十個案例看完你還學不會算我的!!!

2020-09-16 07:32:02 後端開發

Java對日期,日歷及時間的處理一直以來都飽受詬病,尤其是它決定將java.util.Date定義為可修改的以及將SimpleDateFormat實作成非執行緒安全的,看來Java已經意識到需要為時間及日期功能提供更好的支持了,這對已經習慣使用Joda時間日期庫的社區而言也是件好事,關于這個新的時間日期庫的最大的優點就在于它定義清楚了時間日期相關的一些概念,比方說,瞬時時間(Instant),持續時間(duration),日期(date),時間(time),時區(time-zone)以及時間段(Period),同時它也借鑒了Joda庫的一些優點,比如將人和機器對時間日期的理解區分開的,Java 8仍然延用了ISO的日歷體系,并且與它的前輩們不同,java.time包中的類是不可變且執行緒安全的,新的時間及日期API位于java.time包中,下面是里面的一些關鍵的類:

– Instant——它代表的是時間戳

– LocalDate——不包含具體時間的日期,比如2014-01-14,它可以用來存盤生日,周年紀念日,入職日期等,

– LocalTime——它代表的是不含日期的時間

– LocalDateTime——它包含了日期及時間,不過還是沒有偏移資訊或者說時區,

– ZonedDateTime——這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間為基準的,

新的庫還增加了ZoneOffset及Zoned,可以為時區提供更好的支持,有了新的DateTimeFormatter之后日期的決議及格式化也變得煥然一新了,隨便提一句,我是在去年這個時候Java正要推出這個新功能時寫的這篇文章,所以你會發現示例中的時間都還是去年的,你運行下這些例子,它們回傳的值肯定都是正確的,

Java 8是如何處理時間及日期的

有人問我學習一個新庫的最佳途徑是什么?我的回答是,就是在實際專案中那樣去使用它,在一個真實的專案中會有各種各樣的需求,這會促使開發人員去探索和研究這個新庫,簡言之,只有任務本身才會真正促使你去探索及學習,java 8的新的日期及時間API也是一樣,為了學習Java 8的這個新庫,這里我創建了20個以任務為導向的例子,我們先從一個簡單的任務開始,比如說如何用Java 8的時間日期庫來表示今天,接著再進一步生成一個帶時間及時區的完整日期,然后再研究下如何完成一些更實際的任務,比如說開發一個提醒類的應用,來找出距離一些特定日期比如生日,周日紀念日,下一個帳單日,下一個溢價榷訓者信用卡過期時間還有多少天,

示例1 如何 在Java 8中獲取當天的日期
Java 8中有一個叫LocalDate的類,它能用來表示今天的日期,這個類與java.util.Date略有不同,因為它只包含日期,沒有時間,因此,如果你只需要表示日期而不包含時間,就可以使用它,

LocalDate today = LocalDate.now(); System.out.println("Today's Local date : " + today); 

Output 
Today's Local date : 2014-01-14

你可以看到它創建了今天的日期卻不包含時間資訊,它還將日期格式化完了再輸出出來,不像之前的Date類那樣,列印出來的資料都是未經格式化的,

示例2 如何在Java 8中獲取當前的年月日
LocalDate類中提供了一些很方便的方法可以用于提取出年月日以及其它的日期屬性,使用這些方法,你可以獲取到任何你所需要的日期屬性,而不再需要使用java.util.Calendar這樣的類了:

LocalDate today = LocalDate.now(); 
int year = today.getYear(); 
int month = today.getMonthValue(); 
int day = today.getDayOfMonth(); 
System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day); 

Output 
Today's Local date : 2014-01-14 
Year : 2014 Month : 1 day : 14 

可以看到,在Java 8中獲取年月資訊非常簡單,只需使用對應的getter方法就好了,無需記憶,非常直觀,你可以拿它和Java中老的獲取當前年月日的寫法進行一下比較,

示例3 在Java 8中如何獲取某個特定的日期
在第一個例子中,我們看到通過靜態方法now()來生成當天日期是非常簡單的,不過通過另一個十分有用的工廠方法LocalDate.of(),則可以創建出任意一個日期,它接受年月日的引數,然后回傳一個等價的LocalDate實體,關于這個方法還有一個好訊息就是它沒有再犯之前API中的錯,比方說,年只能從1900年開始,月必須從0開始,等等,這里的日期你寫什么就是什么,比如說,下面這個例子中它代表的就是1月14日,沒有什么隱藏邏輯,

LocalDate dateOfBirth = LocalDate.of(2010, 01, 14); 
System.out.println("Your Date of birth is : " + dateOfBirth); 

Output : Your Date of birth is : 2010-01-14

可以看出,創建出來的日期就是我們所寫的那樣,2014年1月14日,

示例4 在Java 8中如何檢查兩個日期是否相等
如果說起現實中實際的處理時間及日期的任務,有一個常見的就是要檢查兩個日期是否相等,你可能經常會碰到要判斷今天是不是某個特殊的日子,比如生日啊,周年紀念日啊,或者假期之類,有的時候,會給你一個日期,讓你檢查它是不是某個日子比方說假日,下面這個例子將會幫助你在Java 8中完成這類任務,正如你所想的那樣,LocalDate重寫了equals方法來進行日期的比較,如下所示:

LocalDate date1 = LocalDate.of(2014, 01, 14); if(date1.equals(today)){ 
	System.out.printf("Today %s and date1 %s are same date %n", today, date1); 
} 

Output 
today 2014-01-14 and date1 2014-01-14 are same date

在本例中我們比較的兩個日期是相等的,同時,如果在代碼中你拿到了一個格式化好的日期串,你得先將它決議成日期然后才能比較,你可以將這個例子與Java之前比較日期的方式進行下比較,你會發現它真是爽多了,

示例5 在Java 8中如何檢查重復事件,比如說生日
在Java中還有一個與時間日期相關的實際任務就是檢查重復事件,比如說每月的帳單日,結婚紀念日,每月還款榷訓者是每年交保險費的日子,如果你在一家電商公司作業的話,那么肯定會有這么一個模塊,會去給用戶發送生日祝福并且在每一個重要的假日給他們捎去問候,比如說圣誕節,感恩節,在印度則可能是萬燈節(Deepawali),如何在Java中判斷是否是某個節榷訓者重復事件?使用MonthDay類,這個類由月日組合,不包含年資訊,也就是說你可以用它來代表每年重復出現的一些日子,當然也有一些別的組合,比如說YearMonth類,它和新的時間日期庫中的其它類一樣也都是不可變且執行緒安全的,并且它還是一個值類(value class),我們通過一個例子來看下如何使用MonthDay來檢查某個重復的日期:

LocalDate dateOfBirth = LocalDate.of(2010, 01, 14); 
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth()); 
MonthDay currentMonthDay = MonthDay.from(today); 
if(currentMonthDay.equals(birthday)){ 
	System.out.println("Many Many happy returns of the day !!"); 
}else{ 
	System.out.println("Sorry, today is not your birthday"); 
} 
	
Output: Many Many happy returns of the day !!

雖然年不同,但今天就是生日的那天,所以在輸出那里你會看到一條生日祝福,你可以調整下系統的時間再運行下這個程式看看它是否能提醒你下一個生日是什么時候,你還可以試著用你的下一個生日來撰寫一個JUnit單元測驗看看代碼能否正確運行,

示例6 如何在Java 8中獲取當前時間

這與第一個例子中獲取當前日期非常相似,這次我們用的是一個叫LocalTime的類,它是沒有日期的時間,與LocalDate是近親,這里你也可以用靜態工廠方法now()來獲取當前時間,默認的格式是hh:mm:ss:nnn,這里的nnn是納秒,可以和Java 8以前如何獲取當前時間做一下比較,

LocalTime time = LocalTime.now(); System.out.println("local time now : " + time);

Output 
local time now : 16:33:33.369 // in hour, minutes, seconds, nano seconds

可以看到,當前時間是不包含日期的,因為LocalTime只有時間,沒有日期,

示例7 如何增加時間里面的小時數
很多時候我們需要增加小時,分或者秒來計算出將來的時間,Java 8不僅提供了不可變且執行緒安全的類,它還提供了一些更方便的方法譬如plusHours()來替換原來的add()方法,順便說一下,這些方法回傳的是一個新的LocalTime實體的參考,因為LocalTime是不可變的,可別忘了存盤好這個新的參考,

LocalTime time = LocalTime.now(); 
LocalTime newTime = time.plusHours(2); // adding two hours 
System.out.println("Time after 2 hours : " + newTime); 

Output : 
Time after 2 hours : 18:33:33.369

可以看到當前時間2小時后是16:33:33.369,現在你可以將它和Java中增加或者減少小時的老的方式進行下比較,一看便知哪種方式更好,

示例8 如何獲取1周后的日期
這與前一個獲取2小時后的時間的例子類似,這里我們將學會如何獲取到1周后的日期,LocalDate是用來表示無時間的日期的,它有一個plus()方法可以用來增加日,星期,或者月,ChronoUnit則用來表示這個時間單位,由于LocalDate也是不可變的,因此任何修改操作都會回傳一個新的實體,因此別忘了保存起來,

LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); 
System.out.println("Today is : " + today); 
System.out.println("Date after 1 week : " + nextWeek); 


Output: 
Today is : 2014-01-14 
Date after 1 week : 2014-01-21

可以看到7天也就是一周后的日期是什么,你可以用這個方法來增加一個月,一年,一小時,一分鐘,甚至是十年,查看下Java API中的ChronoUnit類來獲取更多選項,

示例9 一年前后的日期
這是上個例子的續集,上例中,我們學習了如何使用LocalDate的plus()方法來給日期增加日,周或者月,現在我們來學習下如何用minus()方法來找出一年前的那天,

LocalDate previousYear = today.minus(1, ChronoUnit.YEARS); 
System.out.println("Date before 1 year : " + previousYear); 
LocalDate nextYear = today.plus(1, YEARS); 
System.out.println("Date after 1 year : " + nextYear); 

Output: 
Date before 1 year : 2013-01-14 
Date after 1 year : 2015-01-14

可以看到現在一共有兩年,一個是2013年,一個是2015年,分別是2014的前后那年,

示例10 在Java 8中使用時鐘
Java 8中自帶了一個Clock類,你可以用它來獲取某個時區下當前的瞬時時間,日期或者時間,可以用Clock來替代System.currentTimeInMillis()與 TimeZone.getDefault()方法,

// Returns the current time based on your system clock and set to UTC. 
Clock clock = Clock.systemUTC(); 
System.out.println("Clock : " + clock); 

// Returns time based on system clock zone Clock defaultClock = 
Clock.systemDefaultZone(); 
System.out.println("Clock : " + clock); 

Output: 
Clock : SystemClock[Z] 
Clock : SystemClock[Z]

你可以用指定的日期來和這個時鐘進行比較,比如下面這樣:

public class MyClass { 
	private Clock clock; // dependency inject ... 
	
	public void process(LocalDate eventDate) { 
	
		if(eventDate.isBefore(LocalDate.now(clock)) { 
			... 
		} 
	} 
}

如果你需要對不同時區的日期進行處理的話這是相當方便的,

示例11 在Java中如何判斷某個日期是在另一個日期的前面還是后面
這也是實際專案中常見的一個任務,你怎么判斷某個日期是在另一個日期的前面還是后面,或者正好相等呢?在Java 8中,LocalDate類有一個isBefore()和isAfter()方法可以用來比較兩個日期,如果呼叫方法的那個日期比給定的日期要早的話,isBefore()方法會回傳true,

LocalDate tomorrow = LocalDate.of(2014, 1, 15); 、if(tommorow.isAfter(today)){ 
	System.out.println("Tomorrow comes after today"); 
} 
LocalDate yesterday = today.minus(1, DAYS); 
if(yesterday.isBefore(today)){ 
	System.out.println("Yesterday is day before today"); 
} 

Output: 
Tomorrow comes after today 
Yesterday is day before today

可以看到在Java 8中進行日期比較非常簡單,不需要再用像Calendar這樣的另一個類來完成類似的任務了,

示例12 在Java 8中處理不同的時區
Java 8不僅將日期和時間進行了分離,同時還有時區,現在已經有好幾組與時區相關的類了,比如ZonId代表的是某個特定的時區,而ZonedDateTime代表的是帶時區的時間,它等同于Java 8以前的GregorianCalendar類,使用這個類,你可以將本地時間轉換成另一個時區中的對應時間,比如下面這個例子:

// Date and time with timezone in Java 8 ZoneId america = ZoneId.of("America/New_York"); 
LocalDateTime localtDateAndTime = LocalDateTime.now(); 
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america ); 
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork); 

Output : 
Current date and time in a particular timezone : 2014-01-14T16:33:33.373-05:00[America/New_York]

可以拿它跟之前將本地時間轉換成GMT時間的方式進行下比較,順便說一下,正如Java 8以前那樣,對應時區的那個文本可別弄錯了,否則你會碰到這么一個例外:

Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: ASIA/Tokyo
        at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
        at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
        at java.time.ZoneRegion.ofId(ZoneRegion.java:120)
        at java.time.ZoneId.of(ZoneId.java:403)
        at java.time.ZoneId.of(ZoneId.java:351)  

示例13 如何表示固定的日期,比如信用卡過期時間
正如MonthDay表示的是某個重復出現的日子的,YearMonth又是另一個組合,它代表的是像信用卡還款日,定期存款到期日,options到期日這類的日期,你可以用這個類來找出那個月有多少天,lengthOfMonth()這個方法回傳的是這個YearMonth實體有多少天,這對于檢查2月到底是28天還是29天可是非常有用的,

YearMonth currentYearMonth = YearMonth.now(); System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth()); 
YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY); 
System.out.printf("Your credit card expires on %s %n", creditCardExpiry); 

Output: 
Days in month year 2014-01: 31 
Your credit card expires on 2018-02  

示例14 如何在Java 8中檢查閏年
這并沒什么復雜的,LocalDate類有一個isLeapYear()的方法能夠回傳當前LocalDate對應的那年是否是閏年,如果你還想重復造輪子的話,可以看下這段代碼,這是純用Java撰寫的判斷某年是否是閏年的邏輯,

if(today.isLeapYear()){ 
	System.out.println("This year is Leap year"); 
}else { 
	System.out.println("2014 is not a Leap year"); 
} 


Output: 2014 is not a Leap year

你可以多檢查幾年看看結果是否正確,最好寫一個單元測驗來對正常年份和閏年進行下測驗,

示例15 兩個日期之間包含多少天,多少個月
還有一個常見的任務就是計算兩個給定的日期之間包含多少天,多少周或者多少年,你可以用java.time.Period類來完成這個功能,在下面這個例子中,我們將計算當前日期與將來的一個日期之前一共隔著幾個月,

LocalDate java8Release = LocalDate.of(2014, Month.MARCH, 14); 
Period periodToNextJavaRelease = 
Period.between(today, java8Release); 
System.out.println("Months left between today and Java 8 release : " + periodToNextJavaRelease.getMonths() ); 

Output: 
Months left between today and Java 8 release : 2

可以看到,本月是1月,而Java 8的發布日期是3月,因此中間隔著2個月,

示例16 帶時區偏移量的日期與時間
在Java 8里面,你可以用ZoneOffset類來代表某個時區,比如印度是GMT或者UTC5:30,你可以使用它的靜態方法ZoneOffset.of()方法來獲取對應的時區,只要獲取到了這個偏移量,你就可以拿LocalDateTime和這個偏移量創建出一個OffsetDateTime,

LocalDateTime datetime = LocalDateTime.of(2014, Month.JANUARY, 14, 19, 30); 
ZoneOffset offset = ZoneOffset.of("+05:30"); 
OffsetDateTime date = OffsetDateTime.of(datetime, offset); 
System.out.println("Date and Time with timezone offset in Java : " + date); 

Output : 
Date and Time with timezone offset in Java : 2014-01-14T19:30+05:30

可以看到現在時間日期與時區是關聯上了,還有一點就是,OffSetDateTime主要是給機器來理解的,如果是給人看的,可以使用ZoneDateTime類,

示例17 在Java 8中如何獲取當前時間戳
如果你還記得在Java 8前是如何獲取當前時間戳的,那現在這簡直就是小菜一碟了,Instant類有一個靜態的工廠方法now()可以回傳當前時間戳,如下:

Instant timestamp = Instant.now(); 
System.out.println("What is value of this instant " + timestamp); 

Output : 
What is value of this instant 2014-01-14T08:33:33.379Z

可以看出,當前時間戳是包含日期與時間的,與java.util.Date很類似,事實上Instant就是Java 8前的Date,你可以使用這兩個類中的方法來在這兩個型別之間進行轉換,比如Date.from(Instant)是用來將Instant轉換成java.util.Date的,而Date.toInstant()是將Date轉換成Instant的,

示例18 如何在Java 8中使用預定義的格式器來對日期進行決議/格式化
在Java 8之前,時間日期的格式化可是個技識訓,我們的好伙伴SimpleDateFormat并不是執行緒安全的,而如果用作本地變數來格式化的話又顯得有些笨重,多虧了執行緒本地變數,這使得它在多執行緒環境下也算有了用武之地,但Java維持這一狀態也有很長一段時間了,這次它引入了一個全新的執行緒安全的日期與時間格式器,它還自帶了一些預定義好的格式器,包含了常用的日期格式,比如說,本例 中我們就用了預定義的BASIC_ISO_DATE格式,它會將2014年2月14日格式化成20140114,

String dayAfterTommorrow = "20140116"; 
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, 
DateTimeFormatter.BASIC_ISO_DATE); 
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted); 

Output : 
Date generated from String 20140116 is 2014-01-16

你可以看到生成的日期與指定字串的值是匹配的,就是日期格式上略有不同,

示例19 如何在Java中使用自定義的格式器來決議日期
在上例中,我們使用了內建的時間日期格式器來決議日期字串,當然了,預定義的格式器的確不錯但有時候你可能還是需要使用自定義的日期格式,這個時候你就得自己去創建一個自定義的日期格式器實體了,下面這個例子中的日期格式是”MMM dd yyyy”,你可以給DateTimeFormatter的ofPattern靜態方法()傳入任何的模式,它會回傳一個實體,這個模式的字面量與前例中是相同的,比如說M還是代表月,而m仍是分,無效的模式會拋出DateTimeParseException例外,但如果是邏輯上的錯誤比如說該用M的時候用成m,這樣就沒辦法了,

String goodFriday = "Apr 18 2014"; 
try { 
	DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy"); 	
	LocalDate holiday = LocalDate.parse(goodFriday, formatter); 
	System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday); 
} catch (DateTimeParseException ex) { 
	System.out.printf("%s is not parsable!%n", goodFriday); 
	ex.printStackTrace(); 
} 

Output : 
Successfully parsed String Apr 18 2014, date is 2014-04-18

可以看到日期的值與傳入的字串的確是相符的,只是格式不同,

示例20 如何在Java 8中對日期進行格式化,轉換成字串
在上兩個例子中,盡管我們用到了DateTimeFormatter類但我們主要是進行日期字串的決議,在這個例子中我們要做的事情正好相反,這里我們有一個LocalDateTime類的實體,我們要將它轉換成一個格式化好的日期串,這是目前為止Java中將日期轉換成字串最簡單便捷的方式了,下面這個例子將會回傳一個格式化好的字串,與前例相同的是,我們仍需使用指定的模式串去創建一個DateTimeFormatter類的實體,但呼叫的并不是LocalDate類的parse方法,而是它的format()方法,這個方法會回傳一個代表當前日期的字串,對應的模式就是傳入的DateTimeFormatter實體中所定義好的,

LocalDateTime arrivalDate = LocalDateTime.now(); 
try { 
	DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a"); 
	String landing = arrivalDate.format(format); 
	System.out.printf("Arriving at : %s %n", landing); 
	} catch (DateTimeException ex) { 
	System.out.printf("%s can't be formatted!%n", arrivalDate); 
	ex.printStackTrace(); 
} 

Output : Arriving at : Jan 14 2014 04:33 PM

可以看到,當前時間是用給定的”MMM dd yyyy hh:mm a”模式來表示的,它包含了三個字母表示的月份以及用AM及PM來表示的時間,

Java 8中日期與時間API的幾個關鍵點

看完了這些例子后,我相信你已經對Java 8這套新的時間日期API有了一定的了解了,現在我們來回顧下關于這個新的API的一些關鍵的要素,

  1. 它提供了javax.time.ZoneId用來處理時區,

  2. 它提供了LocalDate與LocalTime類

  3. Java 8中新的時間與日期API中的所有類都是不可變且執行緒安全的,這與之前的Date與Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat這些關鍵的類都不是執行緒安全的,

  4. 新的時間與日期API中很重要的一點是它定義清楚了基本的時間與日期的概念,比方說,瞬時時間,持續時間,日期,時間,時區以及時間段,它們都是基于ISO日歷體系的,

  5. 每個Java開發人員都應該至少了解這套新的API中的這五個類:
    – Instant 它代表的是時間戳,比如2014-01-14T02:20:13.592Z,這可以從java.time.Clock類中獲取,像這樣:
    Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();
    – LocalDate 它表示的是不帶時間的日期,比如2014-01-14,它可以用來存盤生日,周年紀念日,入職日期等,
    – LocalTime – 它表示的是不帶日期的時間
    – LocalDateTime – 它包含了時間與日期,不過沒有帶時區的偏移量
    – ZonedDateTime – 這是一個帶時區的完整時間,它根據UTC/格林威治時間來進行時區調整

  6. 這個庫的主包是java.time,里面包含了代表日期,時間,瞬時以及持續時間的類,它有兩個子package,一個是java.time.foramt,這個是什么用途就很明顯了,還有一個是java.time.temporal,它能從更低層面對各個欄位進行訪問,

  7. 時區指的是地球上共享同一標準時間的地區,每個時區都有一個唯一識別符號,同時還有一個地區/城市(Asia/Tokyo)的格式以及從格林威治時間開始的一個偏移時間,比如說,東京的偏移時間就是+09:00,

  8. OffsetDateTime類實際上包含了LocalDateTime與ZoneOffset,它用來表示一個包含格林威治時間偏移量(+/-小時:分,比如+06:00或者 -08:00)的完整的日期(年月日)及時間(時分秒,納秒),

  9. DateTimeFormatter類用于在Java中進行日期的格式化與決議,與SimpleDateFormat不同,它是不可變且執行緒安全的,如果需要的話,可以賦值給一個靜態變數,DateTimeFormatter類提供了許多預定義的格式器,你也可以自定義自己想要的格式,當然了,根據約定,它還有一個parse()方法是用于將字串轉換成日期的,如果轉換期間出現任何錯誤,它會拋出DateTimeParseException例外,類似的,DateFormatter類也有一個用于格式化日期的format()方法,它出錯的話則會拋出DateTimeException例外,

  10. 再說一句,“MMM d yyyy”與“MMm dd yyyy”這兩個日期格式也略有不同,前者能識別出”Jan 2 2014″與”Jan 14 2014″這兩個串,而后者如果傳進來的是”Jan 2 2014″則會報錯,因為它期望月份處傳進來的是兩個字符,為了解決這個問題,在天為個位數的情況下,你得在前面補0,比如”Jan 2 2014″應該改為”Jan 02 2014″,

關于Java 8這個新的時間日期API就講到這了,這幾個簡短的示例 對于理解這套新的API中的一些新增類已經足夠了,由于它是基于實際任務來講解的,因此后面再遇到Java中要對時間與日期進行處理的作業時,就不用再四處尋找了,我們學習了如何創建與修改日期實體,我們還了解了純日期,日期加時間,日期加時區的區別,知道如何比較兩個日期,如何找到某天到指定日期比如說下一個生日,周年紀念榷訓者保險榷訓有多少天,我們還學習了如何在Java 8中用執行緒安全的方式對日期進行決議及格式化,而無需再使用執行緒本地變數或者第三方庫這種取巧的方式,新的API能勝任任何與時間日期相關的任務,

最后

想要學習java的同學私信回復 資料
領取一線大廠Java面試題總結+阿里巴巴泰山手冊+各知識點學習思維導+一份300頁pdf檔案的Java核心知識點總結!

這些資料的內容都是面試時面試官必問的知識點,篇章包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多執行緒并發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java演算法、資料庫、Zookeeper、分布式快取、資料結構等等,
file

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55052.html

標籤:Java

上一篇:Java自學-圖形界面 日期控制元件

下一篇:C語言

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more