<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          CTO強烈禁止使用Calendar,那用啥?

          共 16468字,需瀏覽 33分鐘

           ·

          2022-08-03 09:56


          文章來源:juejin.cn/post/6937888716438372389???


          目錄
          • 背景

          • 18 個 Java8 日期處理實踐


          背景


          Java 8 已經(jīng)普遍使用了,可是還在有人用 Java Calendar 處理時間和日期,不僅僅性能差,很切代碼很冗余,就不能用 Java 8  提供的新 API 嗎?


          所以 CTO 強制了,必須用 Java 8 處理日期,否則一律開除。下面是整理的 18 種處理日期的方式,可以收藏起來,一定有用。


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


          新 API 基于 ISO 標準日歷系統(tǒng),java.time 包下的所有類都是不可變類型而且線程安全。

          18 個 Java8 日期處理實踐


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

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

          import java.time.LocalDate;

          public class Demo01 {
              public static void main(String[] args) {
                  LocalDate today = LocalDate.now();
                  System.out.println("今天的日期:"+today);
              }
          }
          /*
           運行結(jié)果:
            今天的日期:2018-02-05
          */


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

          package com.shxt.demo02;

          import java.time.LocalDate;

          public class Demo02 {
              public static void main(String[] args) {
                  LocalDate today = LocalDate.now();
                  int year = today.getYear();
                  int month = today.getMonthValue();
                  int day = today.getDayOfMonth();

                  System.out.println("year:"+year);
                  System.out.println("month:"+month);
                  System.out.println("day:"+day);

              }
          }


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

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


          這個方法的好處是沒再犯老 API 的設(shè)計錯誤,比如年度起始于 1900,月份是從 0 開始等等。
          package com.shxt.demo02;

          import java.time.LocalDate;

          public class Demo03 {
              public static void main(String[] args) {
                  LocalDate date = LocalDate.of(2018,2,6);
                  System.out.println("自定義日期:"+date);
              }
          }


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

          package com.shxt.demo02;

          import java.time.LocalDate;

          public class Demo04 {
              public static void main(String[] args{
                  LocalDate date1 = LocalDate.now();

                  LocalDate date2 = LocalDate.of(2018,2,5);

                  if(date1.equals(date2)){
                      System.out.println("時間相等");
                  }else{
                      System.out.println("時間不等");
                  }

              }
          }


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

          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.MonthDay;

          public class Demo05 {
              public static void main(String[] args{
                  LocalDate date1 = LocalDate.now();

                  LocalDate date2 = LocalDate.of(2018,2,6);
                  MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());
                  MonthDay currentMonthDay = MonthDay.from(date1);

                  if(currentMonthDay.equals(birthday)){
                      System.out.println("是你的生日");
                  }else{
                      System.out.println("你的生日還沒有到");
                  }

              }
          }


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


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

          package com.shxt.demo02;

          import java.time.LocalTime;

          public class Demo06 {
              public static void main(String[] args) {
                  LocalTime time = LocalTime.now();
                  System.out.println("獲取當前的時間,不含有日期:"+time);

              }
          }


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


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

          通過增加小時、分、秒來計算將來的時間很常見。Java 8 除了不變類型和線程安全的好處之外,還提供了更好的 plusHours() 方法替換 add(),并且是兼容的。


          注意,這些方法返回一個全新的 LocalTime 實例,由于其不可變性,返回后一定要用變量賦值。
          package com.shxt.demo02;

          import java.time.LocalTime;

          public class Demo07 {
              public static void main(String[] args) {
                  LocalTime time = LocalTime.now();
                  LocalTime newTime = time.plusHours(3);
                  System.out.println("三個小時后的時間為:"+newTime);

              }
          }


          | 示例 8:Java 8 如何計算一周后的日期

          和上個例子計算 3 小時以后的時間類似,這個例子會計算一周后的日期。


          LocalDate 日期不包含時間信息,它的 plus() 方法用來增加天、周、月,ChronoUnit 類聲明了這些時間單位。由于 LocalDate 也是不變類型,返回后一定要用變量賦值。
          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.temporal.ChronoUnit;

          public class Demo08 {
              public static void main(String[] args) {
                  LocalDate today = LocalDate.now();
                  System.out.println("今天的日期為:"+today);
                  LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
                  System.out.println("一周后的日期為:"+nextWeek);

              }
          }


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


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

          利用 minus() 方法計算一年前的日期:
          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.temporal.ChronoUnit;

          public class Demo09 {
              public static void main(String[] args) {
                  LocalDate today = LocalDate.now();

                  LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
                  System.out.println("一年前的日期 : " + previousYear);

                  LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
                  System.out.println("一年后的日期:"+nextYear);

              }
          }


          | 示例 10:Java 8 的 Clock 時鐘類

          Java 8 增加了一個 Clock 時鐘類用于獲取當時的時間戳,或當前時區(qū)下的日期時間信息。


          以前用到 System.currentTimeInMillis() 和 TimeZone.getDefault() 的地方都可用 Clock 替換。
          package com.shxt.demo02;

          import java.time.Clock;

          public class Demo10 {
              public static void main(String[] args{
                  // Returns the current time based on your system clock and set to UTC.
                  Clock clock = Clock.systemUTC();
                  System.out.println("Clock : " + clock.millis());

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

              }
          }


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

          另一個工作中常見的操作就是如何判斷給定的一個日期是大于某天還是小于某天?


          在 Java 8 中,LocalDate 類有兩類方法 isBefore() 和 isAfter() 用于比較日期。調(diào)用 isBefore() 方法時,如果給定日期小于當前日期則返回 true。
          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.temporal.ChronoUnit;


          public class Demo11 {
              public static void main(String[] args) {
                  LocalDate today = LocalDate.now();

                  LocalDate tomorrow = LocalDate.of(2018,2,6);
                  if(tomorrow.isAfter(today)){
                      System.out.println("之后的日期:"+tomorrow);
                  }

                  LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
                  if(yesterday.isBefore(today)){
                      System.out.println("之前的日期:"+yesterday);
                  }
              }
          }


          | 示例 12:Java 8 中處理時區(qū)

          Java 8 不僅分離了日期和時間,也把時區(qū)分離出來了?,F(xiàn)在有一系列單獨的類如 ZoneId 來處理特定時區(qū),ZoneDateTime 類來表示某時區(qū)下的時間。


          這在 Java 8 以前都是 GregorianCalendar 類來做的。下面這個例子展示了如何把本時區(qū)的時間轉(zhuǎn)換成另一個時區(qū)的時間。
          package com.shxt.demo02;

          import java.time.LocalDateTime;
          import java.time.ZoneId;
          import java.time.ZonedDateTime;

          public class Demo12 {
              public static void main(String[] args) {
                  // 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);
              }
          }


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

          與 MonthDay 檢查重復(fù)事件的例子相似,YearMonth 是另一個組合類,用于表示信用卡到期日、FD 到期日、期貨期權(quán)到期日等。


          還可以用這個類得到當月共有多少天,YearMonth 實例的 lengthOfMonth() 方法可以返回當月的天數(shù),在判斷 2 月有 28 天還是 29 天時非常有用。
          package com.shxt.demo02;

          import java.time.*;

          public class Demo13 {
              public static void main(String[] args) {
                  YearMonth currentYearMonth = YearMonth.now();
                  System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
                  YearMonth creditCardExpiry = YearMonth.of(2019, Month.FEBRUARY);
                  System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
              }
          }


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

          package com.shxt.demo02;

          import java.time.LocalDate;

          public class Demo14 {
              public static void main(String[] args{
                  LocalDate today = LocalDate.now();
                  if(today.isLeapYear()){
                      System.out.println("This year is Leap year");
                  }else {
                      System.out.println("2018 is not a Leap year");
                  }

              }
          }


          | 示例 15:計算兩個日期之間的天數(shù)和月數(shù)

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


          下面這個例子中,我們計算了當天和將來某一天之間的月數(shù)。
          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.Period;

          public class Demo15 {
              public static void main(String[] args) {
                  LocalDate today = LocalDate.now();

                  LocalDate java8Release = LocalDate.of(20181214);

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


              }
          }


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

          Instant 類有一個靜態(tài)工廠方法 now() 會返回當前的時間戳,如下所示:
          package com.shxt.demo02;

          import java.time.Instant;

          public class Demo16 {
              public static void main(String[] args) {
                  Instant timestamp = Instant.now();
                  System.out.println("What is value of this instant " + timestamp.toEpochMilli());
              }
          }


          時間戳信息里同時包含了日期和時間,這和 java.util.Date 很像。


          實際上 Instant 類確實等同于 Java 8 之前的 Date 類,你可以使用 Date 類和 Instant 類各自的轉(zhuǎn)換方法互相轉(zhuǎn)換。


          例如:Date.from(Instant) 將 Instant 轉(zhuǎn)換成 java.util.Date,Date.toInstant() 則是將 Date 類轉(zhuǎn)換成 Instant 類。


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

          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.format.DateTimeFormatter;

          public class Demo17 {
              public static void main(String[] args) {
                  String dayAfterTommorrow = "20180205";
                  LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
                          DateTimeFormatter.BASIC_ISO_DATE);
                  System.out.println(dayAfterTommorrow+"  格式化后的日期為:  "+formatted);
              }
          }


          | 示例 18:字符串互轉(zhuǎn)日期類型

          package com.shxt.demo02;

          import java.time.LocalDate;
          import java.time.LocalDateTime;
          import java.time.format.DateTimeFormatter;

          public class Demo18 {
              public static void main(String[] args) {
                  LocalDateTime date = LocalDateTime.now();

                  DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
                        //日期轉(zhuǎn)字符串
                  String str = date.format(format1);

                  System.out.println("日期轉(zhuǎn)換為字符串:"+str);

                  DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
                        //字符串轉(zhuǎn)日期
                  LocalDate date2 = LocalDate.parse(str,format2);
                  System.out.println("日期類型:"+date2);

              }
          }


          推薦閱讀:

          世界的真實格局分析,地球人類社會底層運行原理

          不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

          企業(yè)IT技術(shù)架構(gòu)規(guī)劃方案

          論數(shù)字化轉(zhuǎn)型——轉(zhuǎn)什么,如何轉(zhuǎn)?

          華為干部與人才發(fā)展手冊(附PPT)

          企業(yè)10大管理流程圖,數(shù)字化轉(zhuǎn)型從業(yè)者必備!

          【中臺實踐】華為大數(shù)據(jù)中臺架構(gòu)分享.pdf

          華為的數(shù)字化轉(zhuǎn)型方法論

          華為如何實施數(shù)字化轉(zhuǎn)型(附PPT)

          超詳細280頁Docker實戰(zhàn)文檔!開放下載

          華為大數(shù)據(jù)解決方案(PPT)


          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久操手机在线视频 | 999欧美精选 | 国产精品盗摄!偷窥盗摄 | 久久婷婷综合国产色视频 | 亚洲最大视频在线观看 |