オリジナル:http://it.deepinmind.com/java/2015/03/17/20-examps-date-ndate-di-from-java8.html
Lambdaの表現、ストリーム、いくつかの小さな改善に加えて、Java 8はこのチュートリアルの新しいセットも導入しました。 Javaの日付、カレンダー、および時間処理は常に批判されてきました。特に、java.util.dateを変更し、SimpledateFormatを非スレッドセキュリティに使用することを決定します。 Javaは、日付と日付の機能をより適切にサポートする必要があることに気付いたようです。これは、Joda Timeデータベースの使用に慣れているコミュニティにとっても良いことです。この新しい時間と日付のライブラリの最大の利点は、たとえば、瞬時、時間、時刻(時間)、タイムゾーン(時間)、タイムゾーン(タイムゾーン)に関連するいくつかの概念を定義することです。と期間。同時に、人と機械を区別して時間の日を区別するなど、ジョーダライブラリのいくつかの利点を借用します。 Java 8は依然としてISOカレンダーシステムを使用しており、その前任者とは異なり、Java.timeパッケージのクラスは無関係でスレッドに適用されます。新しい時間と日付のAPIは、java.timeパッケージにあります。
新しいライブラリは、ゾーンオフセットを追加し、ゾーン化されているため、タイムゾーンのサポートが向上します。新しいDateTimeFormatterでは、日付後の日付の分析とフォーマットが新しくなりました。言及してください、私はJavaがこの時点でこの新しい機能を立ち上げようとしていたときにこの記事を書いていたので、例の時間は昨年であることがわかります。これらの例を実行する場合、それらが返す値は正しくなければなりません。
誰かが私に新しいライブラリを学ぶための最良の方法は何ですか?私の答えは、実際のプロジェクトでそれを使用することです。実際のプロジェクトにはさまざまなニーズがあり、開発者がこの新しいライブラリを探求し、研究することを促進します。要するに、タスク自体だけがあなたが本当にあなたを探求して学ぶように促進するでしょう。 Java 8の新しい日付と時刻APIは同じです。 Java 8のこの新しいライブラリを学ぶために、ここで20のタスク指向の例を作成しました。たとえば、Java 8の時刻と日付ライブラリを使用して今日の完全な日付を生成する方法から始めましょう。リマインダーの申請を開発して、誕生日、日曜日の記念日、次のアカウント日付、次のプレミアム日付またはクレジットカードの有効期限に何日かなどの特定の日付を見つけると言われています。
Java 8にはLocaldateというクラスがあり、今日の日付を表すために使用できます。このクラスは、Java.util.dateとはわずかに異なります。これは、日付のみが含まれており、時間がないためです。したがって、時間の代わりに日付を示す必要がある場合は、それを使用できます。
LocalDate = localdate.now(); out.println( "今日の出力);
今日は作成されているが、時間情報は含まれていないことがわかります。また、日付形式を形成し、前の日付クラスとは異なります。
LocalDateクラスは、抽出に使用できる日付やその他の日付属性を使用するための非常に便利な方法を提供します。これらの方法を使用して、必要な日付属性を取得でき、java.util.calendarなどのクラスを使用する必要はなくなりました。
LocalDate = localdate.now();年、月、日)
Java 8で年次情報を取得することは非常に簡単であることがわかります。対応するゲッターメソッド、メモリなし、非常に直感的なものを使用するだけでいいのが非常に簡単です。 Javaでの今月と日の執筆と比較できます。
最初の例では、静的メソッドを通じて日付を生成するのは非常に簡単ですが、別の非常に有用なFactory Method.of()を使用して、パラメーターを受け入れることができますその年、月、そして同等のローカルデートインスタンスを返します。この方法についてのもう1つの良いニュースは、たとえばAPIで間違いを犯さなかったことです。ここで書いているのは、ここで書いているものです。たとえば、次の例では、1月14日を表し、隠された論理はありません。
localdate dateofbirth = localdate.of(2010、01、14);
作成された日付は、2014年1月14日に作成されたものであることがわかります。
実際の実際の処理時間と日付のタスクといえば、2つの日付が等しいかどうかを確認するのが一般的です。今日、誕生日、記念日、休日など、今日が特別な日であるかどうかを判断するかどうかがよく遭遇する可能性があります。時々、特定の日かどうかを確認できるように、日付を提供します。次の例では、Java 8でこのようなタスクを完了するのに役立ちます。ご存知のように、LocalDateは以下に示すように、日付を比較するために等しい方法を書き直しました。
localdate date1 = localdate.of(2014、01、14); 2014-01-14およびDate1 2014-01-14は同じ日付です
この例では、2つの日付が等しいです。同時に、コードでフォーマットされた日付文字列を取得した場合、比較する前に日付として解決する必要があります。この例を比較して、Javaの以前の比較を比較すると、はるかに優れていることがわかります。
また、Javaの日時に関連する実用的なタスクがあり、たとえば、毎月の請求日、結婚記念日、毎月の保険料、または年間保険料を確認します。 E -Commerce Companyで働いている場合、インドでは、クリスマス、感謝祭などの各重要な休日に誕生日の願いを送り、それが可能かもしれませんDeepawaliです。それがフェスティバルであるか、Javaでの繰り返しの事件であるかを判断する方法は?毎月のクラスを使用します。このカテゴリは月ごとに組み合わされており、年間情報は含まれていません。つまり、毎年繰り返される日の一部を表すために使用できます。もちろん、年月クラスなど、他にも組み合わせがあります。また、新しい時間ライブラリの他のタイプとして安全に変更およびスレッドすることもできず、値クラスでもあります。毎月使用して重複日を確認する方法を見てみましょう。
localdate dtealday Birthday.of(2010、01、14); println(「その日の多くの幸せなリターン!!」);
年は異なりますが、今日は誕生日の日なので、生産者に誕生日の祝福が見られます。システムの時間を調整して、次の誕生日がいつあるかを記憶することができるかどうかを確認することができます。
これは、最初の例の現在の日付と非常に似ています。今回は、LocalTimeと呼ばれるクラスを使用します。ここでは、今すぐ静的ファクトリメソッドを使用して現在の時間を取得することもできます。デフォルトの形式はHH:MM:SS:NNNで、NNNはNANOCONDSです。 Java 8で現在の時間を取得する方法と比較できます。
localtime = localtime.now();
Localtimeには時間と日付がないため、現在の時刻には日付が含まれていないことがわかります。
多くの場合、毎分または秒で将来の時間を増やす必要があります。 Java 8は、変更されていないスレッドセーフクラスを提供するだけでなく、元のadd()メソッドを置き換えるためのplushours()などのより便利な方法も提供します。ちなみに、これらの方法は、Localtimeが不変であるため、新しいLocalTimeインスタンスへの参照を返します。この新しいリファレンスを保存することを忘れないでください。
localtime = localtime.now(); newtime.plushours(2); :33.369
現在の2時間後、16:33:33.369であることがわかります。これで、Javaの古い方法を追加または削減するための古い方法と比較できます。一見すると、どちらの方法が優れているか知っています。
これは、前の2時間の前の例に似ています。 LocalDateは、日付なしの日付を示すために使用されます。 LocalDateも不変であるため、変更操作は新しい例を返しますので、保存することを忘れないでください。
localdate nextweek = today(1、chronounit.weeks); IS:2014-01-14 1週間後の日付:2014-01-21
7日後の日付を確認できます。この方法を使用して、1か月、1年、1時間、1分、または10年を増やして、Java APIのChronounitクラスをチェックして、より多くのオプションを取得できます。
これは、前の例の続編です。上記の例では、localdateのPlus()メソッドを使用して、Minus()メソッドを使用してその年を見つける方法を学びましょう。
localdate前iear = minus(1、chronousit.out.println( " + system.out.out.println); " + nextyear);出力:1年前の日付:2013-01-14 1年後:2015-01-14
合計で2年、1つは2013年、もう1つは2015年であることがわかります。これは2014年の前後です。
Java 8には時計クラスが付属しています。これを使用して、特定のタイムゾーンで現在の瞬時時間、日付、または時刻を取得できます。 clockを使用して、system.currenttimeinmillis()およびtimezone.getDefault()メソッドを置き換えることができます。
//システムクロックに基づいて現在の時間を返します。 .systemDefaultZone();
指定された日付を使用して、次のように、このクロックと比較できます。
パブリッククラスMyClass {プライベートクロッククロック;異なるタイムゾーンの日付に対処する必要がある場合、これは非常に便利です。
これは、実際のプロジェクトでも一般的なタスクです。特定の日付が別の日付の前またはその後にあるのか、それとも等しいかどうかをどのように判断しますか? Java 8では、LocalDateクラスには、2つの日付を比較するために使用できるISBEBER()およびISAFTER()メソッドがあります。コールメソッドの日付が指定された日付よりも早い場合、ISBEFORE()メソッドはtrueを返します。
LocalDate Tomomorrow = localdate.of(2014、1、15); ;昨日(今日){昨日は今日の日です」)Java 8の日付は比較的簡単であることがわかります。同様のタスクを完了するためにカレンダーのような別のクラスを使用する必要はありません。
Java 8は、日付と時刻を分離するだけでなく、時には地域も分離します。たとえば、タイムゾーンに関連するいくつかのグループがあります。Zonidは特定のタイムゾーンを表し、ZonedDateTimeはタイムゾーンの時間を表します。これは、Java 8の前のグレゴリアンカレンダークラスと同等です。このクラスを使用して、次の例など、現地時間を別のタイムゾーンの対応する時間に変換できます。
// Java 8 ZoneId.of( "American/News")の日付と時刻TimeZone: " + dateandtimeinnewyork);出力:特定のタイムゾーンの現在の日付と時刻:2014-01-14T16:33.373-05:00 [American/New_York]
現地時間をGMT時間に変換する時間と比較できます。ちなみに、Java 8の前のように、対応するタイムゾーンのテキストが間違ってはならないはずです。そうしないと、そのような例外が遭遇します。
スレッド「Main」java.time.zone.zonerseexception:不明な時間帯ID:lesprovider.java:272のアジア/東京)java.time.zone.zonerulesprovider.getrules(zonerulesprovider.java:227)のJava。 time.zoneregy.ofid(zoneregy.java:120)at java.time.zoneid.of(Zoneid.java:403)at java.time.zoneid.o f(Zoneid.java:351)
毎月の日を表現するのと同じように、年月は別の組み合わせです。このクラスを使用して、その月、長さの数日間()この方法では、今年数日間のインスタンスが何日かを返すことを確認できます。これは、2月の28日か29日かどうかを確認するのに非常に役立ちます。
yearmonth currentyearsth = yearmonth.now(); ;;「クレジットカードは%n」、クレジットカルデエクスプリー:2014-01の日:31
これは複雑ではありません。ローカルデートクラスには、現在のローカルデートに対応する年が跳躍年であるかどうかを返すことができます。それでもホイールを繰り返したい場合は、このコードを見ることができます。
if(today.isleapyear()){system.out.println( "今年は跳躍年");数年間、結果が正しいかどうかを確認できます。
別の一般的なタスクは、指定された2つの日付の間に何日か、数週間または年が含まれているかを計算することです。 Java.timeを使用して、この機能を完了できます。次の例では、現在の日付と将来の日付の数か月前に合計数か月を計算します。
localdate java8release = localdate.of(2014年、3月、14); ))出力:今日からJava 8リリース:2
今月は1月であり、Java 8のリリース日は3月であるため、2か月離れていることがわかります。
Java 8では、ゾーンオフセットクラスを使用して、特定のタイムゾーンを表すことができます。インドはGMTまたはUTC5:30です。このオフセットを取得している限り、LocalDateTimeとこのオフセットを使用してOfficeTateTimeを作成できます。
LocalDaletime = localDateTime.of(2014年、14、19、30); .println( "Javaのタイムゾーンオフセット付き日付と時刻:" +日付);
現在の日付はタイムゾーンに関連付けられていることがわかります。もう1つのポイントは、OfficeTdatimeが主にマシンで理解されていることです。
Java 8の前に現在のタイムスタンプを取得する方法をまだ覚えている場合、これは単なる小さな料理です。インスタントクラスには、次のように現在のタイムスタンプを返す静的工場法があります():
instant timestamp = instant.now();
現在のタイムスタンプには、java.util.dateに似ている日付と時刻が含まれていることがわかります。 java.util.date、およびdate.toinstant()は日付を瞬時に変換します。
Java 8の前に、日時のフォーマットは技術的な作業です。スレッドのローカル変数のおかげで、マルチスレッド環境で有用になりましたが、Javaがこの状態を維持するのは長い時間がかかりました。今回は、新しいスレッドセキュリティの日付と時刻形式を導入しました。また、一般的に使用される日付形式を含むいくつかの所定の形式も付属しています。たとえば、この例では、2014年2月14日から20140114にフォーマットされる事前定義された基本ISO日付形式を使用します。
String dayaftertomrord = "20140116"; -16
発電日は、指定された文字列の値と一致していることがわかります。これは、日付形式でわずかに異なります。
上記の例では、ビルドされた-date and Date形式を使用して、日付文字列を解決しました。もちろん、所定の形式は非常に優れていますが、現時点ではカスタマイズされた日付形式を使用する必要がある場合があります。この例の日付形式は「mmm dd yyyy」です。 OfPattern Static Method()をDateTimeFormationのOfPattern Static Method()に渡すことができます。このモードのリテラル量は、前の例と同じです。たとえば、Mはまだ月を表し、Mはまだ分割されています。無効なモードはDateTimeParseExceptionの異常をスローしますが、たとえば、論理的なエラーの場合、Mの場合はMとして使用する必要があるため、方法はありません。
String goodfriday = "Apr 18 2014" try {dateTimeFormatter.ofpattern( "mmm dd yyyy"); "、goodfriday、holiday);} catch(dateTimeparsexception ex){system.out.printf("%sは解析できない!%n "、goodfriday); ex.printstacktr ace();} output:susterfuly parsed string apr 18 2014 、日付は2014-04-18です日付の値は実際に通過する文字列と一致していることがわかりますが、形式は異なります。
前の2つの例では、DateTimeFormatterクラスを使用しましたが、主に日付文字列を解析しました。この例では、私たちがしなければならないことはまったく逆です。ここには、LocalDateTimeクラスのインスタンスがあり、フォーマットされた日付文字列に変換したいと考えています。これは、これまでにJavaの文字列に日付を変換する最も簡単で最も便利な方法です。次の例では、フォーマットされた文字列を返します。前の例と同様に、指定されたモード文字列を使用してDateTimeFormatterクラスのインスタンスを作成する必要がありますが、LocalDateクラスの解析方法はではなく、そのformat()メソッドです。この方法は、現在の日付を表す文字列を返し、対応するモードは導入されたDateTimeFormatterインスタンスで定義されています。
localdaletime artiondate = localdateTime.now(); system.out.printf( "%sはフォーマットできません!%n"、arviondate);}出力:到着:2014年1月04:33
現在の時間は、「MMM DD YYYY HH:MM A」モードとAMとPMで表される時間を含むことがわかります。
これらの例を読んだ後、私はあなたがJava 8の新しい時間と日付のセットを確実に理解していると思います。次に、この新しいAPIの重要な要素のいくつかを振り返ります。
各Java開発者は、少なくともこれらの新しいAPIの5つのカテゴリを理解する必要があります。
このライブラリのメインバッグはjava.timeです。これには、クラス、時間、瞬時、および代表的な日付、時間、瞬間、および期間が含まれています。 2つのサブパッケージがあります。1つはJava.time.foramtです。もう1つはJava.time.tempagesです。
タイムゾーンとは、地球上で同じ標準時間を共有する領域を指します。各タイムゾーンには、地域/都市(アジア/東京)の形式と、グリニッジ時刻から始まるオフセット時間だけでなく、一意の識別子があります。たとえば、東京のオフセット時間は+09:00です。
officedateTimeクラスには、実際にはlocalDateTimeとゾーンオフセットが含まれています。 Greenwitaのタイムオフセット(+/-時間:+06:00または-08:00)を含む完全な日付(+06:00または-08:00)を示すために使用されます
DateTimeFormatterクラスは、Javaの日付のフォーマットと分析に使用されます。 SimpledateFormatとは異なり、必要に応じて徹底的に安全です。 DateTimeFormatterクラスは、事前に定義された多くの形式を提供し、必要な形式をカスタマイズすることもできます。もちろん、契約によれば、文字列を変換期間中に発生すると、Parse()メソッドもあります。同様に、DateFormatterクラスには、フォーマット日付のフォーマット()メソッドもあります。
たとえば、「MMM D Yyyy」と「MMM DD Yyyy」の2つの日付形式も、「2014年1月2日」の2つの文字列を識別できます。 「2014年1月2日」では、2人のキャラクターがその月に合格すると予想されるため、エラーを報告します。この問題を解決するには、桁数の場合、「2014年1月2日」を「2014年1月」に変更する必要があります。
これは、Java 8の新しい時刻です。これらの簡単な例は、この新しいAPIの新しいAPIの一部を理解するのに十分です。実際のタスクに基づいて説明されているため、Javaで発生した場合、日時を探す必要はありません。時刻の日付を作成して変更する方法を学びました。また、純粋な日付、時間の日付、タイムゾーンのタイムゾーン、次の誕生日などの特定の日を見つける方法を知っています。記念日や保険の日には多くの日があります。また、スレッドローカル変数または第3パーティライブラリを使用することなく、Java 8のスレッドセキュリティの方法の日付を分析およびフォーマットする方法を学びました。新しいAPIは、時間日に関連するあらゆるタスクに対して有能です。
Java 8チュートリアルにも興味がある場合は、次のチュートリアルをご覧ください。
英語のオリジナルリンク