Java 8新しい日時ライブラリjava.timeの使用例


  • Instant――タイムスタンプ
  • を表しています。
  • LocalDate――具体的な日時は含まれていません。例えば、2020-01-14です。誕生日、記念日、入社日などを記憶するために使えます。
  • Local Time――日付を含まない時間
  • を表しています。
  • Local DateTime――日付と時間が含まれていますが、それでもオフセット情報やタイムゾーンはありません。
  • ZonedDateTime――これは、タイムゾーンを含む完全な日付時間であり、オフセット量はUTC/グリニッジ時間を基準としている。
  • Java 8は時間と日付をどう処理しますか?
    例1どのようにしてJava 8で当日の日付を取得しますか?
    
    LocalDate today = LocalDate.now(); 
    System.out.println("Today's Local date : " + today); 
    
    Output 
    Today's Local date : 2020-01-14
    例2 Java 8で現在の年月日をどうやって取得しますか?
    
    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 : 2020-01-14 
    Year : 2020 Month : 1 day : 14
    例3 Java 8における特定の日付の取得方法
    
    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
    例4 Java 8では、2つの日付が等しいかどうかをどうチェックしますか?
    
    LocalDate date1 = LocalDate.of(2020, 01, 14); if(date1.equals(today)){ 
     System.out.printf("Today %s and date1 %s are same date %n", today, date1); 
    } 
    
    Output 
    today 2020-01-14 and date1 2020-01-14 are same date
    例5 Java 8では、誕生日などの重複イベントをどのようにチェックしますか?
    
    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 !!
    例6どのようにして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
    例7時間の中の時間を増やすにはどうすればいいですか?
    
    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
    例8どうやって1週間後の日付を取得しますか?
    
    LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); 
    System.out.println("Today is : " + today); 
    System.out.println("Date after 1 week : " + nextWeek); 
    
    Output: 
    Today is : 2020-01-14 
    Date after 1 week : 2020-01-21
    例9年前後の日付
    
    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 : 2019-01-14 
    Date after 1 year : 2021-01-14
    例10は、Java 8でクロックを使用する。
    
    // 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では、ある日付が他の日付の前かそれとも後かをどう判断しますか?
    
    LocalDate tomorrow = LocalDate.of(2020, 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
    例12は、Java 8で異なるタイムゾーンを処理する。
    
    // 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 : 2020-01-14T16:33:33.373-05:00[America/New_York]
    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どのように固定の日付を表しますか?例えば、クレジットカードの期限が切れる時間。
    
    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 2020-01: 31 
    Your credit card expires on 2018-02
    例14はどのようにJava 8で閏年を検査しますか?
    
    if(today.isLeapYear()){ 
     System.out.println("This year is Leap year"); 
    }else { 
     System.out.println("2020 is not a Leap year"); 
    }
    
    Output: 2020 is not a Leap year
    例15二つの日付の間に何日間、何ヶ月が含まれていますか?
    
    LocalDate java8Release = LocalDate.of(2020, 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
    例16タイムゾーンオフセットの日付と時間
    
    LocalDateTime datetime = LocalDateTime.of(2020, 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 : 2020-01-14T19:30+05:30
    例17 Java 8で現在のタイムスタンプの取得方法
    
    Instant timestamp = Instant.now(); 
    System.out.println("What is value of this instant " + timestamp);
    
    Output : 
    What is value of this instant 2020-01-14T08:33:33.379Z
    例18どのようにしてJava 8に予め定義されたフォーマット器を使用して日付を解析/フォーマットするか?
    
    String dayAfterTommorrow = "20200116"; 
    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 20200116 is 2020-01-16
    例19どのようにJavaでカスタムフォーマットを使って日付を解析しますか?
    
    String goodFriday = "Apr 18 2020"; 
    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 2020, date is 2020-04-18
    例20はどのようにしてJava 8で日付をフォーマットし、文字列に変換しますか?
    
    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 2020 04:33 PM
    例21はタイムスタンプ秒とミリ秒を取得する。
    
    Instant ins= Instant.now();
    System.out.println("10   "+ins.getEpochSecond());
    System.out.println("13    "+ins.toEpochMilli());
    Java 8における日付と時間APIのいくつかの重要な点
  • は、タイムゾーンを処理するためにjavax.time.ZoneIdを提供しています。
  • LocalDateとLocal Timeクラス
  • を提供しています。
  • Java 8における新しい時間と日付APIのすべてのクラスは可変ではなく、スレッドセキュリティであり、これは前のDateとCalendar APIの中のものとは正反対であり、java.util.DateおよびSimpleDateFormatのような重要なクラスはスレッドセキュリティではない。
  • 新しい時間と日付APIにおいて重要なポイントは、基本的な時間と日付の概念を明確に定義していることであり、例えば、瞬時時間、持続時間、日付、時間、タイムゾーンおよび時間帯。これらはすべてISOカレンダーシステムに基づいています。
  • 各Java開発者は、少なくともこの新しいAPIのうちの5つのカテゴリーを理解すべきである。
  • Instantはタイムスタンプを表しています。例えば、2020-01-14 T 02:20 13.592 Zはjava.time.Clock類から取得できます。
  • LocalDateは、2020-01-14など、時間を持たない日付を表しています。誕生日、記念日、入社日などを記憶するために使えます。
  • Local Time Cは、日付なし時間
  • を表しています。
  • Local DateTime Cは時間と日付を含んでいますが、タイムゾーンのオフセットはありません。
  • ZonedDateTime Cこれは時間帯の完全な時間で、UTC/グリニッジ時間によって時間帯の調整を行います。
  • このライブラリのメインパッケージはjava.timeで、代表日、時間、瞬時、および持続時間の種類が含まれています。二つのサブパックがあります。一つはjava.time.foramtです。これは何の用途ですか?もう一つはjava.time.temporalです。もっと低い層から各フィールドにアクセスできます。
  • タイムゾーンとは、地球上で同じ基準時間を共有する地域を指します。タイムゾーンごとに一意の識別子があります。地域/都市のフォーマットとグリニッジ時間からのオフセット時間があります。例えば、東京のオフセット時間は+09:00です。
  • Offset DateTime類は、実際にLocalDateTimeとZoneOffsetを含んでいます。これはグリニッジ時間オフセット(+/-時間:分、例えば+06:00または-08:00)を含む完全な日付(年月日)と時間(時分秒、ナノ秒)を表します。
  • DateTimeFormaterクラスは、Javaで日付のフォーマットと解析を行うために使用される。SimpleDateFormatと違って、可変ではなく、スレッドが安全です。必要なら、静的変数に値を与えられます。DateTimeFormater類は多くの定義済みのフォーマットを提供しています。あなたも自分の欲しいフォーマットをカスタマイズできます。もちろん、約束によって、もう一つのパーミッション()方法は文字列を日付に変換するためのものであり、変換中に何かのエラーが発生したら、DateTimePartseExceptionの異常を投げます。同様に、DateFormater類にも日付をフォーマットするためのformat()の方法があります。エラーが発生したら、DateTimeExceptionを投げます。
  • のもう一つの文を言うと、「MMM d yy」と「MMm dd yyy」の2つの日付フォーマットも少し違っています。前者は「Jan 2 2020」と「Jan 14 2020」の2つの文字を識別できます。後者は「Jan 2 2020」という2つの文字が入ってきたら間違いがあります。この問題を解決するためには、天が一桁の場合、前で0を補充しなければなりません。例えば、「Jan 2 2020」は「Jan 02 2020」に変更するべきです。
  • 締め括りをつける
    ここで、Java 8の新しい日時ライブラリjava.timeに関する記事を紹介します。Java 8の新しい日時ライブラリjava.timeの内容については、以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。