2014年にJava 8がリリースされて以来、古代のJava.util.dateは、Javaでの操作日と時間の唯一の選択肢ではなくなりました。
実際、Javaの日付と時刻の関連するAPIは、常に世界によって批判されてきました。設計部門が不明であるという理由だけでなく、日付と時間の両方を処理できることが多いだけでなく、非常に混乱しています。また、特定の年、月、日付の数値マッピングは、次のような人間に対して保存されます。
多くの場合、特定の年と月の価値を取得する場合、正確な年、月、日付情報を取得するために、対応する操作を行う必要があります。 Java 8まで、サードパーティのオープンソースライブラリJoda-Timeの優れたデザインを借りて、日付と時刻のAPIを再設計しました。前のものと比較して、使いやすいと言えます。関連するすべてのAPIインターフェイスは、パッケージjava.timeにあります。
古代の日付と時刻インターフェース
時間情報を表す日付
世界のすべてのコンピューターは、型の整数を使用しており、この整数の値は、英国のGMTと比較してミリ秒数です(0:0:00、1970年1月1日)。例えば:
public static void main(string [] args){// 1970年1月1日00:00:00 GMT。日付date = new Date(1000); System.out.println(date);}出力結果:
// 1970-1-1 8:00:01thu Jan 01 08:00:01 CST 1970
多くの人が疑問に思うかもしれませんが、1000は標準時間の1秒前に意味があるのかと思うかもしれません。
これは「タイムゾーン」と関係があります。グリニッジにいる場合、結果は予想通りになりますが、中国東部地区に位置し、時刻は8時間前であるため、異なるタイムゾーンに基づく基本的な値は異なります。
日付クラスは、以前に本当に多くの役割を果たしてきました。ソースコードから、時間、月、日を動作させ、時間ゾーンを管理できる方法を操作できる方法があることがわかります。日付と時刻関連の操作だけでそれを持っているだけで十分であると言えます。
しかし、これは世界です。気にしすぎると、当然すべてをカバーすることができなくなります。日付の多くの方法の設計はあまり合理的ではありません。私たちは以前にも言ったことがありますが、それは少し反人間です。したがって、現在の日付クラスのメソッドのほぼ80%が放棄され、 @deprecatedとマークされています。
日付のSun Companyの現在のポジショニングは、瞬間のみを表すことであるため、その内部の位置はその整数のミリ秒を中心に展開し、さまざまな年間暦タイムゾーンやその他の情報に焦点を当てなくなります。
日付により、2つのコンストラクターを介してオブジェクトをインスタンス化できます。
プライベートトランジェントロングファストタイム; public date(){this(system.currenttimemillis());} public date(long date){fasttime = date;}ここでの速い属性は、時間に対応するミリ秒の数を保存します。 2つのコンストラクターはまだ非常にシンプルです。パラメーターレスコンストラクターが呼び出された場合、仮想マシンはシステムの現在の時間値で高速時間を割り当てます。
破棄されていない他のいくつかの方法があります。
その後、JDK1.8に新たに追加された他の2つの方法があり、新しいインターフェイスをJava 8に変換するために使用されます。これは後で導入されます。
アルマナックを説明するカレンダー
カレンダーは、年、月、日などの日付情報を表すために使用されます。これは抽象クラスであるため、そのインスタンスオブジェクトは一般に次の4つの工場メソッドを通じて取得されます。
public staticカレンダーgetInstance()public staticカレンダーgetInstance(Timezone Zone)public static Calendar getInstance(locale alocale)public staticカレンダーGetInstance(Timezone Zone、Locale alocale)
実際、同じ内部メソッドが最終的に呼び出されます。
プライベート静的カレンダーCreateCalendar(TimeZone Zone、Locale Alocale)
この方法には2つのパラメーターが必要です。1つはタイムゾーン、もう1つは国と言語です。つまり、カレンダーインスタンスを構築するには、少なくともこれら2つのパラメーター情報が必要です。そうしないと、システムのデフォルトタイムゾーンまたは言語情報が使用されます。
異なるタイムゾーンと国語は、時間と年、月、日の情報の出力が異なるため、これがカレンダーインスタンスがタイムゾーンと国の情報を渡さなければならない理由でもあります。例を参照してください:
public static void main(string [] args){calendary calendar = calendar.getInstance(); System.out.println(calendar.getTime());カレンダーカレンダー1 = Calendar.GetInstance(TimeZone.getTimeZone( "GMT")、locale.English); system.out.println(calendar1.get(calendar.year) + ":" + calendar1.get(calendar.hour) + ":" + calendar1.get(calendar.minute)); }出力結果:
4月21日SAT 10:32:20 CST 20182018:2:32
ご覧のとおり、最初の出力はシステムのデフォルトタイムゾーンと国の現在の時間であり、グリニッジタイムゾーン(0タイムゾーン)にあることを指定した2番目のカレンダーインスタンスであり、結果も明らかになります。
一部の人々は、最初のカレンダーインスタンスのように、GetTimeメソッドを簡潔に直接呼び出すのではなく、なぜ2番目のカレンダーインスタンスの出力がスプライスに非常に複雑であるのか疑問に思うかもしれません。
これには、カレンダーの内部実装が含まれます。一緒に見てみましょう。
長い間保護されています;パブリック最終日gettime(){return new date(gettimeinmillis());}日付と同様に、カレンダーは内部の時間情報を維持し、getTimeメソッドは実際にこの時間に基づいて日付オブジェクトを構築して戻ります。
一般に、カレンダーインスタンスを構築すると、時間情報が渡されないため、インスタンスが初期化された場合、プログラムはシステムのデフォルトタイムゾーンと現在の時間に基づいてミリ秒数を計算し、時間に割り当てます。
したがって、時間属性値が手動で変更されていないすべてのカレンダーインスタンス内で、時間値はその時のデフォルトタイムゾーンの時間値です。言い換えれば、getTimeの出力結果は、現在のインスタンスに対応するタイムゾーン情報を無視します。これは、カレンダー設計の欠陥でもあります。これにより、インスタンスが初期化されたときのシステムの実行時間のみに依存する2つのカレンダーインスタンスのgettime出力値が依存するためです。
カレンダーは、多くの静的定数といくつかの属性配列も定義します。
public fany static int era = 0; public fany static int year = 1; public final static int month = 2; public final static int week_of_year = 3; public final static int week_of_month = 4; public final static int date = 5; ....保護されたboolean isset []; ...
日付に関するすべての関連情報は属性配列に保存され、これらの静的定数の値はしばしばインデックス値を表します。 GETメソッドを介して、属性インデックスを渡し、属性の値を返します。例えば:
カレンダーmycalendar = calendar.getInstance(); int year = mycalendar.get(calendar.year);
ここでのGETメソッドは、実際にはフィールド[1]を戻り値として直接取得することです。フィールド属性配列は、カレンダーインスタンスが初期化されたときにタイムゾーンと言語に従ってシステムによって計算および割り当てられます。システムのデフォルトタイムゾーンに常に基づいている時間とは異なり、指定したタイムゾーンに基づいて計算されることに注意してください。
個人的には、カレンダーのデザインにはエレガントで不合理な側面があると思います。結局のところ、それは「アンティーク」であり、最終的に交換されます。
DateFormatフォーマット変換
以前の例の1つからわかるように、カレンダーに予想される形式で日付情報を出力することは非常に厄介であり、それ自体で手動でスプライスする必要があります。日付形式は、フォーマットされた文字列とデータティルの間の変換を処理するために使用されます。
カレンダーと同様に、DateFormatも抽象クラスです。ファクトリーメソッドを使用して、インスタンスオブジェクトを生成する必要があります。主に次の工場の方法があります。
//プロセス時間変換パブリック最終static dateformat getTimeInstance()
もちろん、彼らはそれぞれ独自のオーバーロード方法を持っているので、後で詳細を確認します。
DateFormat、形式、解析には2つのタイプのメソッドがあります。
パブリック最終文字列形式(日付)パブリック日付の解析(文字列ソース)
フォーマットメソッドは、日付オブジェクトを文字列としてフォーマットするために使用され、解析方法はフォーマットされた文字列を日付オブジェクトに置き換えるために使用されます。例えば:
public static void main(string [] args){calendary calendar = calendar.getInstance(); dateformat dateformat = dateformat.getDateTimeInstance(); system.out.println(dateformat.format(calendar.getTime());}出力結果:
2018-4-21 16:58:09
明らかに、工場で構成されたDateFormatインスタンスは、出力フォーマットコンテンツをカスタマイズできません。つまり、出力文字列形式が固定されており、場合によっては特別なニーズを満たすことができません。一般に、実装クラスの1つであるSimpledateFormatを直接使用します。
SimpleDateFormatを使用すると、インスタンスを構築するときにパターンパラメーターを渡すことができます。日付文字の出力形式をカスタマイズできます。例えば:
public static void main(string [] args){dateformat dateformat = new simpledateFormat( "yyyyy year mm month dd day"); system.out.println(dateformat.format(new date()));}出力結果:
2018年4月21日
で、
もちろん、文字列の日付を変換するのも非常に便利です。カスタマイズされたモードは許可されていますが、自分で設定したパターンを順守する必要があります。そうしないと、プログラムはうまく解析できません。例えば:
public static void main(string [] args){String str = "2018年4月21日土曜日" "; dateformat sdateformat = new simpledateFormat( "yyyy year m month dd day hh point mm point e"); sdateformat.parse(str); system.out.println(sdateformat.getCalendar()。getTime());}出力結果:
4月21日17:17:00 CST 2018
明らかに、このプログラムは文字列を正しく解析し、内部の日付フォーマットを保存したカレンダーオブジェクトに変換しています。
一般に、日付、カレンダー、日付は一般的な時間と日付の問題を処理することができましたが、必然的に、それらはまだ面倒で使用が困難です。
スペースの制限により、次の記事ではJava 8の新しい日付と時刻のAPIを比較します。よりエレガントなデザインとシンプルな操作があることがわかります。