1. クラスからクラスDateへの切り替えCalendar

このクラスは、そのシンプルさと Unix 標準のサポートによりプログラマーに人気がありましたDateが、ご存知のとおり、どのバラにもトゲがあります。

プログラマーは「スマートな」Dateクラスを求めていました。そして彼らは授業という形で望んでいたものを手に入れましたCalendar。これは、日付を保存するだけでなく、日付を使用して難しい操作を実行する方法として考案されました。

クラスの完全名はCalendarjava.util.Calendar です。コードで使用する場合は、インポート ステートメントに忘れずに追加してください。

次のコマンドを使用してオブジェクトを作成できますCalendar

Calendar date = Calendar.getInstance();

getInstance()クラスの静的メソッドは、現在の日付で初期化されたオブジェクトCalendarを作成します。Calendarプログラムを実行しているコンピュータの設定に基づいて、希望するカレンダーが作成されます。

もっと正確に言えば、あなたが手に入れるカレンダー…それは、地球上の人間は単一のカレンダーに限定されていないからです。その代わりに、彼らはたくさん使います。そして、それらのほとんどすべてが、何らかの宗教または国と関連しています。このCalendarクラスはそのうち 3 つをサポートします。

カレンダー 説明
グレゴリオ暦 キリスト教のグレゴリオ暦
仏教カレンダー 仏暦
日本語皇室カレンダー 大日本帝国暦

ただし、中国カレンダーやアラビアカレンダーもあります。基本的に、時間を使って仕事をするのは思っているほど簡単ではありません。

このレッスンの執筆時点では、中国の暦では正式には 4716 年です。そして、イスラム暦によれば、その年は 1398 年です。プログラマーの友人よ、大きな世界へようこそ。

2. カレンダーオブジェクトの作成

世界で最も一般的なグレゴリオ暦を使用します。少なくとも中国がオラクルを買収し、中国のカレンダーを主流にするまでは。

次のようなステートメントを使用して、任意の日付のカレンダー オブジェクトを作成できます。

Calendar date = new GregorianCalendar(year, month, day);

GregorianCalendarはい、毎回書かなければなりません。の代わりにCalendar、と書くこともできますGregorianCalendar。これも機能します。しかし、ただ書くだけならCalendarもっと短くなります。

年は完全に記述する必要があります。たとえば、2019 の代わりに 19 を書くことはできません。月は依然として 0 から番号付けされます。ただし、以前と同様に、月の日付は 0 から数えられるわけではありません。オタクたち!

日付だけでなく時刻も設定するには、追加の引数として時刻を渡す必要があります。

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

必要に応じてミリ秒単位で渡すこともできます。これらは秒数の後のパラメータです。

3. 画面上にカレンダーオブジェクトを表示する

画面上のカレンダー オブジェクトを単に印刷するだけでは、満足のいく結果は得られません。

コード
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
コンソール出力
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

ここで留意すべき点は、カレンダーは日付ではなくカレンダーであるということです。カレンダーにはあらゆる種類の設定があり、それらはすべて画面に表示されます。

SimpleDateFormatカレンダーを表示するにはオブジェクトを使用するのが適切ですが、それを研究するまでは、このライフハックを使用できます。

Date date = calendar.getTime();

オブジェクトCalendarは簡単にオブジェクトに変換できDateDateオブジェクトを表示する方法はすでに知っています。Calendar次のようなコードを使用して、オブジェクトを に変換できますDate

メソッドの使用getTime():

コード コンソール出力
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

それは全く別の話ですよね。

4. 日付の要素の操作

日付の特定の要素 (年、月など) を取得するために、Calendarクラスには メソッドがありますget()。これは単一のメソッドですが、パラメーターがあります。

int month = calendar.get(Calendar.MONTH);

ここで、calendarCalendar変数、 はクラスMONTHの定数フィールドですCalendar

Calendarクラスの定数フィールドの 1 つを引数としてメソッドに渡すgetと、結果として目的の値が得られます。

コード 説明
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


元号(西暦の前後)




曜日
時 分

日付の要素を変更するには、set次のメソッドを使用します。

calendar.set(Calendar.MONTH, value);

ここで、calendarCalendar変数、 はクラスMONTHの定数フィールドですCalendar

メソッドを操作するときは、クラスの定数フィールドの 1 つを最初の引数としてset渡し、新しい値を 2 番目の引数として渡します。Calendar

コード 説明
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


年 = 2019
月 = 7 月 (0 から番号付け)
4 日
時 分

5.Calendarクラスの定数

クラスの定数フィールドは、Calendar日付の要素に名前を付けるためのものに限定されません。あらゆる場面に応じたフィールドがあるようです。

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

たとえば、月を参照する定数フィールドがあります。

曜日も:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

すべてをリストするわけではありません。コード内でこのような定数を見つけても驚かないでください。

定数を使用するとコードが読みやすくなるため、プログラマは定数を使用します。また、読みやすさを向上させるために、月には 0 から番号が付けられます。か否か。

Calendar6.オブジェクト内の日付を変更する

このCalendarクラスには、よりインテリジェントな方法で日付を操作できるメソッドがあります。たとえば、日付に年、月、または数日を追加できます。あるいはそれらを奪い去ってください。このメソッドは と呼ばれますadd()。これを使って作業すると次のようになります。

calendar.add(Calendar.MONTH, value);

ここで、calendarCalendar変数、 はクラスMONTHの定数フィールドですCalendar

メソッドを操作するときは、クラスの定数フィールドの 1 つを最初の引数としてadd渡し、2 番目の引数として追加する新しい値を渡します。Calendar

これも賢い方法です。それがどれほど賢いのか見てみましょう:

コード
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
コンソール出力
Fri Mar 01 00:00:00 EET 2019

このメソッドは、2019 年 2 月は 28 日しかないことを理解しているため、結果の日付は 3 月 1 日になります。

さあ、2か月を切りましょう!何を手に入れるべきでしょうか?2018年12月27日!今すぐ確認しましょう。

結果が以前の日付になる操作を実行するには、メソッドに負の値を渡す必要がありますadd()

コード
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
コンソール出力
Thu Dec 27 00:00:00 EET 2018

できます!

この方法では、月の長さの違いや閏年も考慮されます。全体として、素晴らしい方法です。これはまさに、日付を扱うほとんどのプログラマーが必要とするものです。

7. 日付のローリング要素

しかし、場合によっては、この賢い動作が望ましくない場合もあります。たとえば、他のすべてを変更せずに日付の一部分に何かを加えたい場合などです。

このクラスには、これを行うためのCalendar特別なroll()メソッドがあります。その署名はメソッドとまったく同じですadd()が、このメソッドは日付の 1 つの要素のみを変更し、残りは変更しません。

例:

コード
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
コンソール出力
Fri Dec 27 00:00:00 EET 2019

月は変わりましたが、年と日付は変わりませんでした。