JDK 1.8完全日時Api(文末付例)

12606 ワード

一、背景jdk 1.8の前に、Java時間はjava.util.Dateおよびjava.util.Calendarクラスを使用する.
Date today = new Date();
System.out.println(today);
    
 //      
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String todayStr = sdf.format(today);
System.out.println(todayStr);
Dateのいくつかの質問:
  • フォーマットされていない場合、Dateで印刷された日付の可読性が悪い.
  • SimpleDateFormatを使用して時間をフォーマットすることができるが、SimpleDateFormatはスレッドが安全ではない(アリババ開発マニュアルではstaticを無効にしてSimpleDateFormatを修飾する).
  • Dateは、ある年、ある月、ある週、n日以降の時間を取得したいなど、時間処理が面倒で、Dateで処理するのは本当に難しいし、Date類のgetYear()getMonth()の方法は廃棄されています.

  • 二、JDK 1.8新しい日時タイプJava8が導入した新しい一連のAPIは、時間日付の処理をよりよくサポートし、時間日付のいくつかの概念を明確に定義し、例えば、瞬時時間(Instant)、持続時間(duration)、日付(date)、時間(time)、時間領域(time-zone)、および時間帯(Period)を定義する.
  • LocalDate:時間を含まない日付、例えば2019-10-14.誕生日、周年記念日、入社日などを保存するのに使えます.
  • LocalTime:LocalDateと対照的で、日付を含まない時間です.
  • LocalDateTime:日付と時刻が含まれており、オフセット情報(タイムゾーン)はありません.
  • ZonedDateTime:タイムゾーンの完全な日付時間を含み、オフセット量はUTC/グリニッジ時間を基準とする.
  • Instant:System.currentTimeMillis()と同様のタイムスタンプ.
  • Duration:期間を表します.
  • Period:年月日で1つの期間を測定することを表す.
  • DateTimeFormatter:新しい日付解析フォーマットクラス.

  • 2.1 LocalDate LocalDateクラスには日付のみが含まれ、特定の時間は含まれません.時間を含まずに日付を表すだけで使用できます.
    public static void localDate() {
        //       
        LocalDate today = LocalDate.now();
        System.out.println("     :" + today);
    
        //         
        int thisYear = today.getYear();
        int thisYearAnother = today.get(ChronoField.YEAR);
        System.out.println("   " + thisYear + " ");
        System.out.println("   " + thisYearAnother + " ");
    
        //    
        Month thisMonth = today.getMonth();
        System.out.println(thisMonth.toString());
        //          (    )
        int monthOfYear = today.getMonthValue();
        // int monthOfYear = today.get(ChronoField.MONTH_OF_YEAR);
        System.out.println("        " + monthOfYear + "  ");
        //      
        int length = today.lengthOfMonth();
        System.out.println("    " + length + " ");
    
        //         
        int thisDay = today.getDayOfMonth();
        int thisDayAnother = today.get(ChronoField.DAY_OF_MONTH);
        System.out.println("        " + thisDay + " ");
        System.out.println("        " + thisDayAnother + " ");
    
        //     
        DayOfWeek thisDayOfWeek = today.getDayOfWeek();
        System.out.println(thisDayOfWeek.toString());
        //          
        int dayOfWeek = today.get(ChronoField.DAY_OF_WEEK);
        System.out.println("       " + dayOfWeek + " ");
    
        //      
        boolean leapYear = today.isLeapYear();
        System.out.println("     :" + leapYear);
    
        //        
        LocalDate anotherDay = LocalDate.of(2008, 8, 8);
        System.out.println("     :" + anotherDay);
    }

    2.2 LocalTime LocalTimeは時間のみを取得し、日付は取得しません.LocalTimeLocalDateは同様で、LocalDateには特定の時間が含まれておらず、LocalTimeには特定の日付が含まれていないという違いがあります.
    public static void localTime() {
        //       
        LocalTime nowTime = LocalTime.now();
        System.out.println("    :" + nowTime);
    
        //         
        int hour = nowTime.getHour();
        int thisHour = nowTime.get(ChronoField.HOUR_OF_DAY);
        System.out.println("   :" + hour);
        System.out.println("   :" + thisHour);
    
    
        //        
        int minute = nowTime.getMinute();
        int thisMinute = nowTime.get(ChronoField.MINUTE_OF_HOUR);
        System.out.println("   :" + minute);
        System.out.println("   :" + thisMinute);
    
        //        
        int second = nowTime.getSecond();
        int thisSecond = nowTime.get(ChronoField.SECOND_OF_MINUTE);
        System.out.println("   :" + second);
        System.out.println("   :" + thisSecond);
    
        //       (      )
        LocalTime anotherTime = LocalTime.of(20, 8, 8);
        System.out.println("      :" + anotherTime);
    }

    2.3 LocalDateTime LocalDateTimeは日付と時刻の組み合わせを表す.of()メソッドによって直接作成することもできるし、LocalDateatTime()メソッドまたはLocalTimeatDate()メソッドを呼び出してLocalDateまたはLocalTimeを1つのLocalDateTimeに統合することもできる.
    public static void localDateTime() {
        //        
        LocalDateTime today = LocalDateTime.now();
        System.out.println("   :" + today);
    
        //          
        LocalDateTime anotherDay = LocalDateTime.of(2008, Month.AUGUST, 8, 8, 8, 8);
        System.out.println("        :" + anotherDay);
    
        //        
        //       ,        LocalDateTime
        LocalDateTime thisTime = LocalTime.now().atDate(LocalDate.of(2008, 8, 8));
        System.out.println("      :" + thisTime);
        //       ,        LocalDateTime
        LocalDateTime thisDay = LocalDate.now().atTime(LocalTime.of(12, 24, 12));
        System.out.println("      :" + thisDay);
        //           LocalDateTime
        LocalDateTime thisDayAndTime = LocalDateTime.of(LocalDate.of(2008, 8, 8), LocalTime.of(12, 24, 12));
        System.out.println("      :" + thisDayAndTime);
    
        //   LocalDate
        LocalDate todayDate = today.toLocalDate();
        System.out.println("     :" + todayDate);
    
        //   LocalTime
        LocalTime todayTime = today.toLocalTime();
        System.out.println("     :" + todayTime);
    }

    2.4 Instant Instantは、System.currentTimeMillis()と同様のタイムスタンプを取得するために使用されるが、Instantはナノ秒まで正確に使用することができる.
    public class InstantDemo {
    
        public static void main(String[] args) {
    
            //   Instant  
            Instant instant = Instant.now();
            //   ofEpochSecond    (        ,         )
            Instant another = Instant.ofEpochSecond(365 * 24 * 60, 100);
    
            //      
            long currentSecond = instant.getEpochSecond();
            System.out.println("     :" + currentSecond);
    
            //       
            long currentMilli = instant.toEpochMilli();
            System.out.println("      :" + currentMilli);
        }
    }

    2.5 Duration Durationの内部実装はInstantと類似しているが、Durationは期間を表し、betweenメソッドによって作成され、of()メソッドによって作成されてもよい.
    public static void duration() {
        LocalDateTime from = LocalDateTime.now();
        LocalDateTime to = LocalDateTime.now().plusDays(1);
        //   between()    
        Duration duration = Duration.between(from, to);
        //   of()    ,                。
        // 7 
        Duration duration1 = Duration.of(7, ChronoUnit.DAYS);
        // 60 
        Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);
    }

    2.5 Period PeriodDurationと同様に、1つの期間を取得しますが、単位は年月日です.ofメソッドとbetweenメソッドで作成することもできます.betweenメソッドで受信したパラメータはLocalDateです.
    private static void period() {
        //   of  
        Period period = Period.of(2012, 12, 24);
        //   between  
        Period period1 = Period.between(LocalDate.now(), LocalDate.of(2020,12,31));
    }

    三、時間操作
    3.1時間比較isBefore()およびisAfter()は、所定の時間または日付が別の時間/日付の前または後であるかを判断する.LocalDateを例にとると、LocalDateTime/LocalTimeと同様である.
    public static void compare() {
        LocalDate thisDay = LocalDate.of(2008, 8, 8);
        LocalDate otherDay = LocalDate.of(2018, 8, 8);
    
        //   
        boolean isAfter = thisDay.isAfter(otherDay);
        System.out.println(isAfter);
    
        //   
        boolean isBefore = thisDay.isBefore(otherDay);
        System.out.println(isBefore);
    }

    3.2年数、月数、日数の増加/減少LocalDateTimeを例にとると、LocalDate/LocalTimeと同様である.
    public static void plusAndMinus() {
        //   
        LocalDateTime today = LocalDateTime.now();
        LocalDateTime nextYearDay = today.plusYears(1);
        System.out.println("       :" + nextYearDay);
        LocalDateTime nextMonthDay = today.plus(1, ChronoUnit.MONTHS);
        System.out.println("        :" + nextMonthDay);
    
        //  
        LocalDateTime lastMonthDay = today.minusMonths(1);
        LocalDateTime lastYearDay = today.minus(1, ChronoUnit.YEARS);
        System.out.println("     :" + lastMonthDay);
        System.out.println("    :" + lastYearDay);
    }

    3.3時間変更withによる修正時間
    public static void edit() {
        LocalDateTime today = LocalDateTime.now();
        //     2012 
        LocalDateTime thisYearDay = today.withYear(2012);
        System.out.println("        :" + thisYearDay);
        //    12 
        LocalDateTime thisMonthDay = today.with(ChronoField.MONTH_OF_YEAR, 12);
        System.out.println("        :" + thisMonthDay);
    }

    3.4時間計算TemporalAdjustersの静的方法とDurationによる時間の計算
    public static void compute() {
        // TemporalAdjusters      
        LocalDate today = LocalDate.now();
        //         
        LocalDate date = today.with(firstDayOfYear());
        System.out.println("       :" + date);
    
        // Duration   
        LocalDateTime from = LocalDateTime.now();
        LocalDateTime to = LocalDateTime.now().plusMonths(1);
        Duration duration = Duration.between(from, to);
    
        //       
        //    
        long days = duration.toDays();
        System.out.println("  " + days + " ");
        //    
        long hours = duration.toHours();
        System.out.println("  " + hours + "  ");
        //    
        long minutes = duration.toMinutes();
        System.out.println("  " + minutes + "  ");
    }
  • TemporalAdjustersのより多くの方法
  • メソッド名
    説明dayOfWeekInMonth()
    同じ月の週の日付を返します.firstDayOfMonth()
    当月の初日にもどるfirstDayOfNextMonth()
    来月の初日に戻るfirstDayOfNextYear()
    次の年の初日に戻るfirstDayOfYear()
    本年の初日に戻るfirstInMonth()
    同じ月の最初の曜日を返します.lastDayOfMonth()
    当月の最終日に戻るlastDayOfNextMonth()
    来月の最終日に戻るlastDayOfNextYear()
    次の年の最後の日に戻るlastDayOfYear()
    本年最後の日に戻るlastInMonth()
    同じ月の最後の曜日を返しますnext() / previous()
    次の/前の指定された曜日を返します.nextOrSame() / previousOrSame()
    次の曜日/前の曜日を返します.この値が条件を満たしている場合は、直接返します.
    四、時間日付フォーマット
    4.1フォーマット時間DateTimeFormatterのデフォルトでは、さまざまなフォーマットが提供されています.デフォルトでは、要件を満たすことができない場合は、DateTimeFormatterofPatternメソッドでカスタムフォーマットを作成できます.
    public static void format() {
        LocalDate today = LocalDate.now();
        //            
        String todayStr1 = today.format(DateTimeFormatter.BASIC_ISO_DATE);
        String todayStr2 = today.format(DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println("     :" + todayStr1);
        System.out.println("     :" + todayStr2);
        //      
        DateTimeFormatter dateTimeFormatter =   DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String todayStr3 = today.format(dateTimeFormatter);
        System.out.println("        :" + todayStr3);
    
    }

    4.2解析時間
    4.1でどのようにフォーマットするかは,ここで同様に解析する必要がある.
    public static void parse() {
        LocalDate date1 = LocalDate.parse("20080808", DateTimeFormatter.BASIC_ISO_DATE);
        LocalDate date2 = LocalDate.parse("2008-08-08", DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(date1);
        System.out.println(date2);
    }

    五、まとめDateよりも優れています
  • Instantの精度はより高く、ナノ秒レベルまで正確にすることができる.
  • Durationは時間帯内の日数、時間数などを簡単に得ることができる.
  • LocalDateTime年、月、日、来月などを迅速に取得できます.
  • TemporalAdjustersクラスには、ツールクラスを自分で作成することを避けるために、多くの一般的な静的方法が含まれています.
  • は、Dateのフォーマット方式SimpleDateFormatと比較して、DateTimeFormatterはスレッドが安全である.

  • 5.1サンプルコード
    Githubサンプルコード
    5.2技術交流
  • 風塵ブログ
  • 風塵ブログ-掘金
  • 風塵ブログ-ブログ園
  • Github