誰かが私に新しいライブラリを学ぶための最良の方法は何ですか?私の答えは、実際のプロジェクトでそれを使用することです。実際のプロジェクトにはさまざまなニーズがあり、開発者がこの新しいライブラリを探索して調査するように促します。要するに、タスク自体だけがあなたが探求して学ぶことを本当に奨励するでしょう。 Java 8の新しい日付と時刻APIについても同じことが言えます。このJava 8の新しいライブラリを学ぶには、20のタスク指向の例を作成しました。 Java 8時刻と日付ライブラリを使用して今日を表現する方法などの簡単なタスクから始めましょう。その後、時間とタイムゾーンで完全な日付を生成し、リマインダーアプリケーションを開発するなど、より実用的なタスクを完了する方法を研究して、誕生日、誕生日、次の請求日、クレジットカードの透過時間などの特定の日付を確認する方法を調べます。
例1 Java8でその日の日付を取得する方法
Java 8にはLocaldateと呼ばれるクラスがあり、今日の日付を表すために使用できます。このクラスは、Java.util.dateとはわずかに異なります。これには日付と時間がないためです。したがって、時間を含めずに日付を表す必要がある場合は、それを使用できます。
LocalDate Today = localdate.now(); System.out.println( "今日の現地日:" +今日);出力今日のローカルデート:2014-01-14
時間情報なしで今日の日付を作成することがわかります。また、日付をフォーマットしてから出力します。前の日付クラスとは異なり、印刷されたデータはフォーマットされていません。
例2今年、月、Java 8の日を取得する方法8
LocalDateクラスは、年、月、日、その他の日付属性を抽出するためのいくつかの便利な方法を提供します。これらの方法を使用して、java.util.calendarなどのクラスを使用せずに、必要な日付属性を取得できます。
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);出力今日の現地日:2014-01-14YEAR:2014 Month:1日:14
ご覧のとおり、Java 8で年および月の情報を取得するのは非常に簡単です。メモリなしで、対応するGetterメソッドを使用してください。非常に直感的です。 Javaで今年、月、日を取得する古い執筆方法と比較できます。
例3 Java 8で特定の日付を取得する方法
最初の例では、静的メソッドを介して1日の日付を生成するのは非常に簡単であることがわかりますが、別の非常に有用な工場メソッドlocaldate.of()を使用して、年、月、日のパラメーターを取得し、同等のローカルデートインスタンスを返す日付を作成できます。この方法については、以前のAPIで間違いを犯さなかったという別の良いニュースがあります。たとえば、年は1900年にのみ開始でき、月は0から開始する必要があります。たとえば、以下の例では、1月14日を表し、隠された論理はありません。
localdate dateofbirth = localdate.of(2010、01、14); System.out.println( "生年月日は:" + dateofbirth);出力:生年月日は2010-01-14です
2014年1月14日、作成の日付が私たちが書いたものであることがわかります。
例4 Java 8で2つの日付が等しいかどうかを確認する方法
実際に処理時間と日付の実際のタスクについて話す場合、1つの一般的なことは、2つの日付が等しいかどうかを確認することです。今日、誕生日、記念日、休日など、今日が特別な日であるかどうかについての質問に遭遇することがよくあります。時々、たとえば休日など、特定の日かどうかを確認する日付が与えられます。次の例では、Java 8でこのタイプのタスクを完了するのに役立ちます。ご想像のとおり、LocalDateは次のように日付を比較するために等しい方法をオーバーライドします。
localdate date1 = localdate.of(2014、01、14); if(date1.equals(today)){system.out.printf( "今日の%sと日付1%sは同じ日付%n"、今日、日付1); }今日の出力2014-01-14とdate1 2014-01-14は同じ日付ですこの場合、比較する2つの日付は等しいです。同時に、コードでフォーマットされた日付文字列を取得した場合、比較する前に日付に解析する必要があります。この例を、Javaが以前の日付を比較する方法と比較することができ、とてもエキサイティングであることがわかります。
例5 Java 8の重複イベントをチェックする方法、誕生日など
Javaの日時に関連する別の実用的なタスクがあります。これは、毎月の請求日、結婚記念日、毎月の返済日、毎年保険料を支払う日など、重複したイベントを確認することです。電子商取引会社で働いている場合、クリスマスや感謝祭などのすべての重要な休日に誕生日の願いを送り、彼らに挨拶を送るモジュールが間違いなくあります。 Javaでのフェスティバルか重複イベントなのかを判断する方法は?毎月のクラスを使用します。このクラスは月と日で構成されており、年間情報が含まれていません。つまり、毎年繰り返し表示される日を表すために使用することができます。もちろん、年月クラスなど、他の組み合わせがいくつかあります。また、新しい時刻と日付ライブラリの他のクラスのように不変でスレッドセーフであり、バリュークラスでもあります。例を使用して、毎月使用して重複日を確認する方法を確認しましょう。
localdate dateofbirth = localdate.of(2010、01、14);月の誕生日=月day.of(dateofbirth.getmonth()、dateofbirth.getdayofmonth());月のcurrentmonthday = monthday.from(Today); if(currentmonthday.equals(誕生日)){system.out.println( "その日の多くの幸せなリターン!!"); } else {system.out.println( "ごめんなさい、今日はあなたの誕生日ではありません"); }出力:その日の多くの幸せなリターン!!年は異なりますが、今日は誕生日なので、生産物に誕生日の願いがあります。システムの時間を調整し、プログラムを実行して、次の誕生日がいつあるかを思い出させるかどうかを確認できます。また、次の誕生日にJunitユニットテストを作成して、コードが正しく実行できるかどうかを確認することもできます。
例6 Java 8で現在の時間を取得する方法
これは、最初の例で現在の日付を取得することに非常に似ています。今回は、LocalTimeというクラスを使用しています。これは、日付のない時間であり、LocalDateに相対的な時間です。ここでは、今すぐ静的工場法を使用して現在の時間を取得することもできます。デフォルトの形式はHH:MM:SS:NNNで、NNNはNANOCONDSです。以前にJava 8で現在の時間を取得する方法と比較できます。
localtime time = localtime.now(); system.out.println( "現地時間現在:" + time);現在の出力現地時間:16:33:33.369 //時間、数分、秒、ナノ秒
ご覧のとおり、現在の時間には日付が含まれていません。LocalTimeには時間と日付がないためです。
例7時間の時間数を増やす方法
多くの場合、将来の時間を計算するために時間、数分、または秒を追加する必要があります。 Java 8は、不変のスレッドセーフクラスを提供するだけでなく、元のadd()メソッドを置き換えるためにPlushours()などのより便利な方法も提供します。ちなみに、これらの方法は、Localtimeが不変であるため、新しいLocalTimeインスタンスへの参照を返します。この新しいリファレンスを保存することを忘れないでください。
localtime time = localtime.now(); localtime newtime = time.plushours(2); // 2時間System.out.println( "2時間後の時間:" + newTime);出力:2時間後の時間:18:33:33.369
2時間後、現在の時間は16:33:33.369であることがわかります。これで、Javaの時間を追加または短縮する古い方法と比較できます。一見すると、どの方法が優れているかを知ることができます。
例8 1週間後に日付を取得する方法
これは、2時間後に時間を取得する前の例に似ています。ここでは、1週間後に日付を取得する方法を学びます。 LocalDateは、時間のない日付を表すために使用されます。日、週、または月を追加するために使用できるPlus()メソッドがあり、Chronounitはこの時間単位を表すために使用されます。 LocalDateも不変であるため、変更操作は新しいインスタンスを返しますので、保存することを忘れないでください。
localdate nextweek = today.plus(1、chronounit.weeks); system.out.println( "今日は:" + today); system.out.println( "1週間後の日付:" + nextweek);出力:今日:2014-01-14DATE 1週間後:2014-01-21
日付が7日間、つまり1週間で何であるかを見ることができます。この方法を使用して、1か月、年、時間、分、10年を追加して、Java APIのChronounitクラスをチェックして、より多くのオプションを取得できます。
例9日付約1年
これは、前の例の続編です。上記の例では、LocalDateのPlus()メソッドを使用して日付を日付に追加する方法を学びました。次に、1年前の1日を見つけるためにminus()メソッドを使用する方法を学びましょう。
localdate前iear = Today.minus(1、chronounit.years); System.out.println( "1年前の日付:" +前iEar); localdate nextyear = today.plus(1、years); System.out.println( "1年後の日付:" + nextyear);出力:1年前の日付:2013-01-14date 1年後:2015-01-14
2013年には1つ、2015年には2年、2014年頃に2年があることがわかります。
例10 Java 8で時計を使用しています
Java 8には時計クラスが付属しており、特定のタイムゾーンで現在のインスタント時間、日付、または時刻を取得するために使用できます。 clockを使用して、system.currenttimeinmillis()およびtimezone.getDefault()メソッドを置き換えることができます。
//システムクロックに基づいて現在の時間を返し、UTCに設定します。 clock clock = clock.systemutc(); System.out.println( "clock:" + clock); //システムクロックゾーンクロックに基づいて時間を返しますdefaultclock = clock.systemdefaultzone(); System.out.println( "clock:" + clock);出力:Clock:SystemCrock [Z] Clock:SystemClock [Z]
このクロックを指定された日付と比較できます。
パブリッククラスMyClass {プライベートクロッククロック; //依存関係注入... public void process(localdate eventdate){if(eventdate.isbefore(localdate.now(clock)){...}}}}これは、異なるタイムゾーンで日付を処理する必要がある場合に非常に便利です。
例11日付がJavaの別の日付の前か後にあるかを判断する方法
これは、実際のプロジェクトでも一般的なタスクです。日付が別の日付の前か後にあるのか、それとも正確に等しいかをどのように見ますか? Java 8では、LocalDateクラスには、2つの日付を比較するために使用できるISBEBER()およびISAFTER()メソッドがあります。メソッドを呼び出す日付が指定された日付よりも早い場合、ISBEFORE()メソッドはtrueを返します。
LocalDate明日= LocalDate.of(2014、1、15); 、if(tommorow.isafter(Today)){system.out.println( "明日は今日の後に来る"); } LocalDate昨日= Today.Minus(1、日); if(昨日.isbefore(today)){system.out.println( "昨日は今日の日です"); } output:明日は昨日の今日の今日の後の今日ですJava 8の日付は非常に簡単であることがわかります。カレンダーのような別のクラスを使用して、同様のタスクを完了する必要はありません。
例12 Javaの異なるタイムゾーンの処理8
Java 8は日付と時間を分離するだけでなく、タイムゾーンもあります。現在、タイムゾーン関連のクラスのセットがいくつかあります。たとえば、Zonidは特定のタイムゾーンを表し、ZonedDateTimeはタイムゾーンの時間を表します。これは、Java 8の前のグレゴリアンカレンダークラスに相当します。このクラスを使用すると、次の例など、現地時間を別のタイムゾーンの対応する時間に変換できます。
// Javaのタイムゾーンの日付と時刻8 Zoneid America = Zoneid.of( "America/new_york"); localdateTime localtdateandtime = localdateTime.now(); zoneddatime dateandtimeinnewyork = zoneddatetime.of(localtdateandtime、アメリカ); System.out.println( "特定のタイムゾーンの現在の日付と時刻:" + dateandtimeinnewyork);出力:特定のタイムゾーンの現在の日付と時刻:2014-01-14T16:33:33.373-05:00 [アメリカ/new_york]
現地時間をGMT時間に変換する以前の方法と比較できます。ちなみに、Java 8の前と同じように、タイムゾーンに対応するテキストを間違えないでください。そうしないと、そのような例外に遭遇します。
スレッドの例外「メイン」java.time.zone.zonerulesexception:不明な時間ゾーンID:asia/tokyo at java.time.zone.zonerulesprovider.getProvider(zonerulesprovider.java:272) 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. zunid.java.zoneid. Zonid.java
例13クレジットカードの有効期限など、固定日を表す方法
毎月の日が繰り返される日を表すように、年月は別の組み合わせであり、クレジットカードの返済日、定期預金の満期日、オプションの満期日などの日付を表します。このクラスを使用して、その月に何日かを確認できます。 lengthofmonth()メソッドは、今年のインスタンスに何日があるかを返します。これは、2月が28日か29日かどうかを確認するのに非常に役立ちます。
yearmonth currentyearmonth = yearmonth.now(); System.out.printf( "月の日数%s:%d%n"、currentyearmonth、currentyearmonth.lengthofmonth()); yearmonth creditcardexpiry = yearmonth.of(2018、month.february); System.out.printf( "クレジットカードは%n"で期限切れになります。出力:2014-01の日:31yourクレジットカードは2018-02に期限切れになります
例14 Java 8で跳躍年を確認する方法
これは複雑ではありません。 LocalDateクラスには、現在のLocalDateに対応する年が跳躍年であるかどうかを返すことができるISLeapyEar()メソッドがあります。それでもホイールを再現したい場合は、このコードを見ることができます。これは、1年が純粋にJavaで書かれた跳躍年であるかどうかを判断する論理です。
if(today.isleapyear()){system.out.println( "今年は跳躍年"); } else {system.out.println( "2014は跳躍年ではありません"); }出力:2014年は跳躍年ではありません結果が正しいかどうかを確認するために、さらに数年間確認できます。通常の年と跳躍年をテストするためにユニットテストを書くのが最善です。
例15 2つの日付の間に何日か月と月が含まれていますか
別の一般的なタスクは、2つの指定された日付の間に何日、週、または年が含まれるかを計算することです。 java.time.periodクラスを使用して、この関数を完了できます。次の例では、現在の日付が将来の日付から分離されている数ヶ月を計算します。
localdate java8release = localdate.of(2014、month.march、14);期間tonetonextjavarelease = period.between(今日、Java8Release); System.out.println( "今日からJava 8リリースの間に残っている月:" + feistonextjavareease.getmonths());出力:今日とJava 8リリースの間に残っている月:2
ご覧のとおり、今月は1月であり、Java 8のリリース日は3月であるため、2か月があります。
例16タイムゾーンオフセット付きの日付と時刻
Java 8では、インドはGMTまたはUTC5:30などの特定のタイムゾーンを表すゾーンオフセットクラスを使用して、対応するタイムゾーンを取得するために静的メソッドゾーンオフセット()メソッドを使用できます。このオフセットを取得している限り、LocalDateTimeとこのオフセットを使用してOffsetDateTimeを作成できます。
LocalDateTime DateTime = localDateTime.of(2014、Month.January、14、19、30); ZONEOFFSET OFFSET = ZONEOFFSET.OF( "+05:30"); offsetDateTime date = offsetDateTime.of(datetime、offset); System.out.println( "Javaのタイムゾーンオフセット付き日付と時刻:2014-01-14T19:30+05:30
現在の時間と日付はタイムゾーンに関連していることがわかります。もう1つの点は、OffsetDateTimeは主にマシンが理解できるということです。それが人々が見ることができるなら、あなたはZonedateTimeクラスを使用できます。
例17 Java 8で現在のタイムスタンプを取得する方法
Java 8の前に現在のタイムスタンプを取得する方法をまだ覚えているなら、それは今のケーキです。インスタントクラスには、次のように現在のタイムスタンプを返すことができる静的な工場メソッドがあります()。
インスタントタイムスタンプ= instant.now(); System.out.println( "このインスタントの価値は何ですか" +タイムスタンプ);出力:このインスタント2014-01-14T08:33:33.379zの価値
現在のタイムスタンプには日付と時刻が含まれていることがわかります。これはjava.util.dateに非常に似ています。実際、インスタントはJava 8の前の日付です。これら2つのクラスのメソッドを使用して、これら2つのタイプ間を変換できます。たとえば、日付(インスタント)は、java.util.dateにインスタントを変換し、日付をインスタントに変換するためにインスタントを変換します。
例18 Java 8で事前定義されたフォーマッタを使用して解析/フォーマット日付
Java 8の前に、時間と日付のフォーマットは技術的な仕事でした。当社の優れたパートナーSimpledateFormatはスレッドセーフではなく、フォーマットにローカル変数として使用すると少しかさばるように見えます。スレッドローカル変数のおかげで、これによりマルチスレッド環境で実行可能になりますが、Javaはこの状態を長い間維持してきました。今回は、まったく新しいスレッドセーフの日付と時刻のフォーマッタを紹介します。また、一般的に使用される日付形式を含む、いくつかの事前定義されたフォーマッタが付属しています。たとえば、この例では、2014年2月14日に20140114にフォーマットする定義済みのBasiciSodate形式を使用します。
文字列dayaftertommorrow = "20140116"; localdate formatted = localdate.parse(dayaftertommorrow、datetimeformatter.basic_iso_date); system.out.printf( "string%sから生成された日付は%s%n"、dayaftertommorrow、フォーマット);出力:文字列20140116から生成された日付は2014-01-16です
生成された日付は、指定された文字列の値と一致することがわかります。つまり、日付形式はわずかに異なります。
例19カスタムフォーマッタを使用してJavaの日付を解析する方法
上記の例では、組み込みの時間日付のフォーマッタを使用して、日付文字列を解析しました。もちろん、事前定義されたフォーマッタは確かに良いですが、カスタム日付形式を使用する必要がある場合があります。この時点で、自分でカスタム日付のフォーマッタインスタンスを作成する必要があります。次の例の日付形式は「MMM DD YYYY」です。任意のパターンをDateTimeFormatterのOfPattern Static Method()に渡すことができます。これは、このパターンのリテラル値が前の例と同じであるため、インスタンスを返します。たとえば、Mはまだ月を表しますが、Mはまだセグメントです。無効なモードでは、DateTimeParseExceptionの例外がスローされますが、Mを使用する時期にMを使用するなど、論理的なエラーである場合、何もすることはありません。
文字列goodfriday = "2014年4月18日"; try {dateTimeFormatter formatter = dateTimeFormatter.ofpattern( "mmm dd yyyy"); LocalDate Holiday = localdate.parse(goodfriday、formatter); System.out.printf( "Stursed String%S、日付は%S%n"、Goodfriday、Holiday); } catch(datetimeparseexception ex){system.out.printf( "%sは解析できない!%n"、goodfriday); ex.printstacktrace(); }出力:2014年4月18日に解析された文字列、日付は2014-04-18です日付の値は、渡された文字列と一致していることがわかりますが、形式は異なります。
例20日付をフォーマットしてJava 8の文字列に変換する方法
前の2つの例では、DateTimeFormatterクラスを使用しましたが、主に日付文字列を解析します。この例では、反対を行います。ここには、LocalDateTimeクラスのインスタンスがあり、フォーマットされた日付文字列に変換したいと考えています。これは、日付をJavaの文字列に変換するための最も簡単で最も便利な方法です。次の例では、フォーマットされた文字列を返します。前の例と同じことは、指定されたパターン文字列を使用してDateTimeFormatterクラスのインスタンスを作成する必要があることですが、呼び出しはLocalDateクラスの解析方法ではなく、その形式()メソッドです。この方法は、現在の日付を表す文字列を返し、対応するパターンは着信DateTimeFormatterインスタンスで定義されます。
localdateTime artiondate = localdateTime.now(); try {dateTimeFormatter Format = DateTimeFormatter.ofPattern( "mmm dd yyyy hh:mm a");文字列ランディング= arvenydate.format(format); System.out.printf( "到着:%s%n"、着陸); } catch(datetimeexception ex){system.out.printf( "%sはフォーマットできません!%n"、到着date); ex.printstacktrace(); }出力:到着:2014年1月14日04:33 PM現在の時刻は、与えられた「MMM DD YYYY HH:MM A」パターンで表されることがわかります。
Java8の日付と時刻APIのいくつかの重要なポイント
これらの例を読んだ後、Java 8の新しい時刻と日付APIについて特定の理解があると思います。次に、この新しいAPIに関するいくつかの重要な要素を確認しましょう。
1.時間ゾーンを処理するためにJavax.time.zoneidを提供します。
2。ローカルデートおよびローカルタイムクラスを提供します
3. Java 8の新しい時刻および日付APIのすべてのクラスは、前の日付とカレンダーAPIの正反対であり、スレッドセーフです。 java.util.dateやsimpledateformatなどの重要なクラスは、スレッドセーフではありません。
4.新しい時間と日付のAPIの非常に重要な点は、瞬時、期間、日付、時刻、時間帯、期間など、時間と日付の基本概念を明確に定義することです。これらはすべてISOカレンダーシステムに基づいています。
5.すべてのJava開発者は、この新しいAPIで少なくともこれらの5つのクラスを知っておく必要があります。
6.このライブラリの主なパッケージはJava.Timeです。これには、日付、時刻、インスタント、および期間を表すクラスが含まれています。 2つのサブパッケージがあります。1つはjava.time.foramtです。これはこれが何に使用されているかが明らかであり、もう1つは低レベルからさまざまなフィールドにアクセスできるJava.time.temporalです。
7。タイムゾーンとは、同じ標準時間を共有する地球上の地域を指します。各タイムゾーンには一意の識別子があり、地域/都市(アジア/東京)形式とグリニッジ時間からのオフセット時間もあります。たとえば、東京のオフセット時間は+09:00です。
8. OffsetDateTimeクラスには、実際にはLocalDateTimeとZoneOffsetが含まれています。グリニッジタイムオフセット(+/-時間:分、分、ナノ秒)を含む完全な日付(年、月、日)および時間(時間、分、ナノ秒)を表すために使用されます。
9. DateTimeFormatterクラスは、Javaの日付をフォーマットおよび解析するために使用されます。 SimpledateFormatとは異なり、それは不変でスレッドセーフであり、必要に応じて静的変数に割り当てることができます。 DateTimeFormatterクラスは、多くの事前定義されたフォーマットを提供し、必要な形式をカスタマイズすることもできます。もちろん、条約によれば、文字列を日付に変換するために使用されるparse()メソッドもあり、変換中にエラーが発生した場合、DateTimeParseException例外がスローされます。同様に、DateFormatterクラスには、日付をフォーマットするフォーマット()メソッドもあります。失敗した場合、datetimeexceptionがスローされます。
10。別の言い方をすれば、「MMM D Yyyy」と「MMM DD Yyyy」の2つの日付形式もわずかに異なります。前者は「2014年1月2日」と「2014年1月14日」という2つの文字列を認識でき、後者は「2014年1月2日」が送信された場合にエラーを報告します。この問題を解決するには、1日が1桁の場合、「2014年1月2日」に「2014年1月2日」に変更する必要があります。
これは、新しい時刻と日付のAPIであるJava 8に関するものです。これらの短い例は、この新しいAPIの新しいクラスのいくつかを理解するのに十分です。実際のタスクに基づいて説明されているため、日時と日付を処理する必要があるJavaで作業に遭遇した場合、もう検索する必要はありません。日付インスタンスを作成および変更する方法を学びました。また、純粋な日付、日付と時刻、日付とタイムゾーンの違い、2つの日付を比較する方法、および次の誕生日、記念日、保険日などの特定の日を特定する日を見つける方法についても学びました。また、スレッドローカル変数やサードパーティライブラリを使用せずに、Java 8の日付とフォーマットの日付をスレッドに安全な方法で解析し、フォーマットする方法を学びました。新しいAPIは、いつでも日付関連のタスクで有能です。