教你18個Java8日期處理的實踐,太有用了吧

Java 8 推出了全新的日期時間API,在教程中我們將通過一些簡單的實例來學習如何使用新API

教你18個Java8日期處理的實踐,太有用了吧

Java處理日期、日曆和時間的方式一直為社區所詬病,將 java.util.Date設定為可變類型,以及SimpleDateFormat的非線程安全使其應用非常受限。

新API基於ISO標準日曆系統,java.time包下的所有類都是不可變類型而且線程安全。

教你18個Java8日期處理的實踐,太有用了吧

示例1:Java 8中獲取今天的日期

Java 8 中的 LocalDate 用於表示當天日期。和java.util.Date不同,它只有日期,不包含時間。當你僅需要表示日期時就用這個類。

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
publicclassDemo01{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
System.out.println("今天的日期:"+today);
}
}/<code>

示例2:Java 8中獲取年、月、日信息

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
publicclassDemo02{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
intyear=today.getYear();
intmonth=today.getMonthValue();
intday=today.getDayOfMonth();
System.out.println("year:"+year);
System.out.println("month:"+month);
System.out.println("day:"+day);
}
}/<code>

示例3:Java 8中處理特定日期

我們通過靜態工廠方法now()非常容易地創建了當天日期,你還可以調用另一個有用的工廠方法LocalDate.of()創建任意日期, 該方法需要傳入年、月、日做參數,返回對應的LocalDate實例

。這個方法的好處是沒再犯老API的設計錯誤,比如年度起始於1900,月份是從0開 始等等。

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
publicclassDemo03{
publicstaticvoidmain(String[]args){
LocalDatedate=LocalDate.of(2018,2,6);
System.out.println("自定義日期:"+date);
}
}/<code>

示例4:Java 8中判斷兩個日期是否相等

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
publicclassDemo04{
publicstaticvoidmain(String[]args){
LocalDatedate1=LocalDate.now();
LocalDatedate2=LocalDate.of(2018,2,5);
if(date1.equals(date2)){
System.out.println("時間相等");
}else{
System.out.println("時間不等");
}
}
}/<code>

示例5:Java 8中檢查像生日這種週期性事件

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.MonthDay;
publicclassDemo05{
publicstaticvoidmain(String[]args){
LocalDatedate1=LocalDate.now();
LocalDatedate2=LocalDate.of(2018,2,6);
MonthDaybirthday=MonthDay.of(date2.getMonth(),date2.getDayOfMonth());
MonthDaycurrentMonthDay=MonthDay.from(date1);
if(currentMonthDay.equals(birthday)){
System.out.println("是你的生日");
}else{
System.out.println("你的生日還沒有到");

}
}
}/<code>

只要當天的日期和生日匹配,無論是哪一年都會打印出祝賀信息。你可以把程序整合進系統時鐘,看看生日時是否會受到提醒,或者寫一個單元測試來檢測代碼是否運行正確。

示例6:Java 8中獲取當前時間

<code>packagecom.shxt.demo02;
importjava.time.LocalTime;
publicclassDemo06{
publicstaticvoidmain(String[]args){
LocalTimetime=LocalTime.now();
System.out.println("獲取當前的時間,不含有日期:"+time);
}
}/<code>

可以看到當前時間就只包含時間信息,沒有日期

示例7:Java 8中獲取當前時間

通過增加小時、分、秒來計算將來的時間很常見。Java 8除了不變類型和線程安全的好處之外,還提供了更好的plusHours()方法替換add(),並且是兼容的。注意,這些方法返回一個全新的LocalTime實例,由於其不可變性,返回後一定要用變量賦值。

<code>packagecom.shxt.demo02; 

importjava.time.LocalTime;
publicclassDemo07{
publicstaticvoidmain(String[]args){
LocalTimetime=LocalTime.now();
LocalTimenewTime=time.plusHours(3);
System.out.println("三個小時後的時間為:"+newTime);
}
}
/<code>

示例8:Java 8如何計算一週後的日期

和上個例子計算3小時以後的時間類似,這個例子會計算一週後的日期。LocalDate日期不包含時間信息,它的plus()方法用來增加天、周、月,ChronoUnit類聲明瞭這些時間單位。由於LocalDate也是不變類型,返回後一定要用變量賦值。

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.temporal.ChronoUnit;
publicclassDemo08{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
System.out.println("今天的日期為:"+today);
LocalDatenextWeek=today.plus(1,ChronoUnit.WEEKS);
System.out.println("一週後的日期為:"+nextWeek);
}
}/<code>

可以看到新日期離當天日期是7天,也就是一週。你可以用同樣的方法增加1個月、1年、1小時、1分鐘甚至一個世紀,更多選項可以查看Java 8 API中的ChronoUnit類

示例9:Java 8計算一年前或一年後的日期

利用minus()方法計算一年前的日期

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.temporal.ChronoUnit;
publicclassDemo09{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
LocalDatepreviousYear=today.minus(1,ChronoUnit.YEARS);
System.out.println("一年前的日期:"+previousYear);
LocalDatenextYear=today.plus(1,ChronoUnit.YEARS);
System.out.println("一年後的日期:"+nextYear);
}
}
/<code>

示例10:Java 8的Clock時鐘類

Java 8增加了一個Clock時鐘類用於獲取當時的時間戳,或當前時區下的日期時間信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替換。

<code>packagecom.shxt.demo02;
importjava.time.Clock;
publicclassDemo10{
publicstaticvoidmain(String[]args){
//ReturnsthecurrenttimebasedonyoursystemclockandsettoUTC.
Clockclock=Clock.systemUTC();
System.out.println("Clock:"+clock.millis());
//Returnstimebasedonsystemclockzone
ClockdefaultClock=Clock.systemDefaultZone();
System.out.println("Clock:"+defaultClock.millis());
}
}
/<code>

示例11:如何用Java判斷日期是早於還是晚於另一個日期

另一個工作中常見的操作就是如何判斷給定的一個日期是大於某天還是小於某天?在Java 8中,LocalDate類有兩類方法isBefore()和isAfter()用於比較日期。調用isBefore()方法時,如果給定日期小於當前日期則返回true。

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.temporal.ChronoUnit;
publicclassDemo11{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
LocalDatetomorrow=LocalDate.of(2018,2,6);
if(tomorrow.isAfter(today)){
System.out.println("之後的日期:"+tomorrow);
}
LocalDateyesterday=today.minus(1,ChronoUnit.DAYS);
if(yesterday.isBefore(today)){
System.out.println("之前的日期:"+yesterday);
}
}
}
/<code>

示例12:Java 8中處理時區

Java 8不僅分離了日期和時間,也把時區分離出來了。現在有一系列單獨的類如ZoneId來處理特定時區,ZoneDateTime類來表示某時區下的時間。這在Java 8以前都是 GregorianCalendar類來做的。下面這個例子展示了如何把本時區的時間轉換成另一個時區的時間。

<code>packagecom.shxt.demo02;
importjava.time.LocalDateTime;
importjava.time.ZoneId;

importjava.time.ZonedDateTime;
publicclassDemo12{
publicstaticvoidmain(String[]args){
//DateandtimewithtimezoneinJava8
ZoneIdamerica=ZoneId.of("America/New_York");
LocalDateTimelocaltDateAndTime=LocalDateTime.now();
ZonedDateTimedateAndTimeInNewYork=ZonedDateTime.of(localtDateAndTime,america);
System.out.println("Currentdateandtimeinaparticulartimezone:"+dateAndTimeInNewYork);
}
}
/<code>

示例13:如何表示信用卡到期這類固定日期,答案就在YearMonth

與 MonthDay檢查重複事件的例子相似,YearMonth是另一個組合類,用於表示信用卡到期日、FD到期日、期貨期權到期日等。還可以用這個類得到 當月共有多少天,YearMonth實例的lengthOfMonth()方法可以返回當月的天數,在判斷2月有28天還是29天時非常有用。

<code>packagecom.shxt.demo02;
importjava.time.*;
publicclassDemo13{
publicstaticvoidmain(String[]args){
YearMonthcurrentYearMonth=YearMonth.now();
System.out.printf("Daysinmonthyear%s:%d%n",currentYearMonth,currentYearMonth.lengthOfMonth());
YearMonthcreditCardExpiry=YearMonth.of(2019,Month.FEBRUARY);
System.out.printf("Yourcreditcardexpireson%s%n",creditCardExpiry);
}
}
/<code>

示例14:如何在Java 8中檢查閏年

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
publicclassDemo14{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
if(today.isLeapYear()){

System.out.println("ThisyearisLeapyear");
}else{
System.out.println("2018isnotaLeapyear");
}
}
}
/<code>

示例15:計算兩個日期之間的天數和月數

有一個常見日期操作是計算兩個日期之間的天數、週數或月數。在Java 8中可以用java.time.Period類來做計算。

下面這個例子中,我們計算了當天和將來某一天之間的月數。

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.Period;
publicclassDemo15{
publicstaticvoidmain(String[]args){
LocalDatetoday=LocalDate.now();
LocalDatejava8Release=LocalDate.of(2018,12,14);
PeriodperiodToNextJavaRelease=Period.between(today,java8Release);
System.out.println("MonthsleftbetweentodayandJava8release:"
+periodToNextJavaRelease.getMonths());
}
}
/<code>

示例16:在Java 8中獲取當前的時間戳

Instant類有一個靜態工廠方法now()會返回當前的時間戳,如下所示:

<code>packagecom.shxt.demo02;
importjava.time.Instant;
publicclassDemo16{
publicstaticvoidmain(String[]args){
Instanttimestamp=Instant.now();

System.out.println("Whatisvalueofthisinstant"+timestamp.toEpochMilli());
}
}
/<code>

時間戳信息裡同時包含了日期和時間,這和java.util.Date很像。實際上Instant類確實等同於 Java 8之前的Date類,你可以使用Date類和Instant類各自的轉換方法互相轉換,例如:Date.from(Instant) 將Instant轉換成java.util.Date,Date.toInstant()則是將Date類轉換成Instant類。

示例17:Java 8中如何使用預定義的格式化工具去解析或格式化日期

<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.format.DateTimeFormatter;
publicclassDemo17{
publicstaticvoidmain(String[]args){
StringdayAfterTommorrow="20180205";
LocalDateformatted=LocalDate.parse(dayAfterTommorrow,
DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(dayAfterTommorrow+"格式化後的日期為:"+formatted);
}
}/<code>

示例18:字符串互轉日期類型


<code>packagecom.shxt.demo02;
importjava.time.LocalDate;
importjava.time.LocalDateTime;
importjava.time.format.DateTimeFormatter;
publicclassDemo18{
publicstaticvoidmain(String[]args){
LocalDateTimedate=LocalDateTime.now();
DateTimeFormatterformat1=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");
//日期轉字符串
Stringstr=date.format(format1);

System.out.println("日期轉換為字符串:"+str);
DateTimeFormatterformat2=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");
//字符串轉日期
LocalDatedate2=LocalDate.parse(str,format2);
System.out.println("日期類型:"+date2);
}
}/<code>

最後

覺得此文不錯的大佬們可以多多關注哦,小玖每週會不定時更新幾篇精品乾貨文,還請大家多多支持!

教你18個Java8日期處理的實踐,太有用了吧


分享到:


相關文章: