Java 8の中の時間はよく処理されます。

11243 ワード

前書き:久しぶりにブログを書きました。最近いいのを見ました。
https://juejin.im/post/5a795bad6fb9a0634f407ae5
Java 8日付処理
Java 8は、新しい日時APIを発表しました。教程では、いくつかの簡単な例を通して、新しいAPIの使い方を学びます。
Java処理日付、カレンダと時間の方式はずっとコミュニティに非難されています。java.util.Dateを可変タイプに設定し、SimpleDateFormatの非スレッドセキュリティを適用することは非常に制限されています。
新しいAPIはISO標準カレンダーシステムに基づいています。java.timeパッケージのすべてのクラスは可変タイプではなく、スレッドセキュリティです。
番号付け
クラスの名前
説明
1
インスト
タイムスタンプ
2
Duration
時間が悪い
3
Locall Date
日付のみを含みます。例えば、2018-02-05
4
Local Time
時間だけが含まれています。例えば、23:12:10
5
Local DateTime
日付と時間を含みます。例えば、2018-02-05 23:14:21
6
Period
時間帯
7
ZoneOffset
タイムゾーンのオフセット、たとえば:+8:00
8
ZonedDateTime
タイムゾーンの時間
9
Clock
時計、たとえば、現在の米国ニューヨークの時間を取得します。
10
java.time.format.DateTimeFormater
時間の書式設定
例1:Java 8で今日の日付を取得します。
Java 8のLocalDateは、その日の日付を表します。java.util.Dateと違って、日付だけです。時間は含まれていません。日付を表示するだけでこのクラスを使います。
package com.shxt.demo02;

import java.time.LocalDate;

publicclass Demo01 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("     :"+today);
    }
}
/*
	    :
		     :2018-02-05
*/

例2:Java 8で年、月、日の情報を取得する
package com.shxt.demo02;

import java.time.LocalDate;

publicclass 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で特定の日付を処理する
静的工場法now()によって、その日の日付が簡単に作成されました。他の有用な工場方法LocalDate.of()の作成日を呼び出してもいいです。この方法は、着信年、月、日のパラメータを必要とします。対応するLocalDateの例を返します。この方法の利点は、長年のAPIの設計ミスを犯さないことです。例えば、年度は1900年から始まり、月は0から始まります。
package com.shxt.demo02;

import java.time.LocalDate;

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

例4:Java 8では、2つの日付が等しいかどうかを判定します。
package com.shxt.demo02;

import java.time.LocalDate;

publicclass 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;

publicclass 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("        ");
        }

    }
}


その日の日付と誕生日が一致すれば、どの年でも祝賀メッセージが印刷されます。プログラムをシステムクロックに統合して、誕生日にアラームがあるかどうかを確認したり、ユニットを書いてテストして、コードが正しく動作しているかを確認してください。
例6:Java 8で現在の時間を取得する
package com.shxt.demo02;

import java.time.LocalTime;

publicclass Demo06 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        System.out.println("       ,     :"+time);

    }
}


現在の時間は時間情報だけで、日付がありません。
例7:Java 8で現在の時間を取得する
時間、分、秒を増やすことで、将来の時間を計算するのが一般的です。Java 8は、不変型とスレッドセキュリティの利点の他に、より良いplusHours()方法を提供してadd()を置換し、互換性がある。これらの方法は全く新しいLocal Timeの例を返します。可変性がないので、帰ったら必ず変数の割り当てをします。
package com.shxt.demo02;

import java.time.LocalTime;

publicclass 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;

publicclass 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時間、1分または1世紀を増やすことができます。さらに多くのオプションはJava 8 APIのChronoUnit類を見ることができます。
例9:Java 8は一年前または一年後の日付を計算します。
一年前の日付をminus()で計算します。
package com.shxt.demo02;

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

publicclass 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クロッククラスを追加して、タイムスタンプまたは現在のタイムゾーンの日付時間情報を取得する。以前はSystem.currentTimeInMillis()とTimeZone.get Default()を使っていたところは全部Clockで換えられます。
package com.shxt.demo02;

import java.time.Clock;

publicclass 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クラスには、2つの方法isBefore()とisAfter()があります。
isBefore()メソッドを呼び出した場合、指定された日付が現在の日付より小さい場合、trueに戻ります。
package com.shxt.demo02;

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


publicclass 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でタイムゾーンを処理する
Java 8は日付と時間を分離しただけでなく、タイムゾーンも分離しました。今はZoneIdのような一連の別個のクラスがあります。特定のタイムゾーンを処理します。Zone DateTime類はあるタイムゾーン下の時間を表します。これはJava 8以前はGregorianCalender類でした。この例では、このタイムゾーンの時間を別のタイムゾーンに変換する方法を示しています。
package com.shxt.demo02;

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

publicclass 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:クレジットカードの期限が切れるという固定日付をどう表しますか?答えはYear Monthにあります。
MonthDayチェック重複イベントの例と同様に、YearMonthはクレジットカードの有効期限、FD満期日、先物オプションの満了日などを示す別のグループです。このような種類で、今月は何日間の日数が得られますか?YearMonth例のlengthOfMonth()方法は、その月の日数に戻ります。2月は28日と29日のどちらかを判断する時に役立ちます。
package com.shxt.demo02;

import java.time.*;

publicclass 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;

publicclass 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:2つの日付の間の日数と月数を計算します。
一般的な日付操作は、2つの日付の間の日数、週数または月数を計算します。Java 8では、java.time.Period類で計算ができます。この例では、その日と将来のある日の間の月数を計算します。
package com.shxt.demo02;

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

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

        LocalDate java8Release = LocalDate.of(2018, 12, 14);

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


    }
}

例16:Java 8で現在のタイムスタンプを取得する
Instant類の静的工場法now()は現在のタイムスタンプに戻ります。
package com.shxt.demo02;

import java.time.Instant;

publicclass 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類それぞれの変換方法を使ってお互いに変換できます。
例えば、Date.fromはInstantをjava.util.Dateに変換し、Date.toInstantはDateクラスをInstantクラスに変換する。
例17:Java 8では、どのように事前定義されたフォーマットツールを使用して日付を解析または書式設定しますか?
package com.shxt.demo02;

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

publicclass 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:文字列相互転送日付タイプ
package com.shxt.demo02;

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

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

        DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
		//      
        String str = date.format(format1);

        System.out.println("        :"+str);

        DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
		//      
        LocalDate date2 = LocalDate.parse(str,format2);
        System.out.println("    :"+date2);

    }
}