1. 日時 API の紹介

日時 API の紹介

Java の作成者は、Date クラスと Calendar クラスの状況を好みませんでした。彼らは当時はよかったですが、時代は変わります。そして、シンプルで強力かつ信頼できるものが必要になりました。そして、Java 8 のリリース (Calendar登場から 15 年後) で、Java Date Time APIが導入されました。これは、時間を扱うあらゆるタスクを解決できる一連のクラスです。

クラスが非常に多かったので、いくつかのパッケージに分割されました。

このパッケージは Java Date Time API の基本パッケージであり、、 、、、、 などjava.timeのクラスが含まれています。これらのクラスのオブジェクトはすべて です。つまり、作成後に変更することはできません。LocalDateLocalTimeLocalDateTimeInstantPeriodDurationimmutable

パッケージjava.time.formatには、時刻の書式設定、つまり時刻 (および日付) を文字列に変換したり、その逆を変換したりするためのクラスが含まれています。たとえば、クラスDateTimeFormatterを置き換える汎用クラスが含まれていますSimpleDateFormat

パッケージjava.time.zoneには、タイムゾーンを操作するためのクラスが含まれています。TimeZoneや などのクラスが含まれていますZonedDateTime。世界のさまざまな場所にあるクライアント用のサーバー コードを作成する場合、これらのクラスが実際に必要になります。


2.LocalDateクラス

最初に説明する Date Time API の最も便利なクラスは、クラスですLocalDate。おそらく名前から推測できるように、このクラスは日付を操作するように設計されています。

このクラスのオブジェクトは作成後に変更されません。つまり、LocalDateクラスは不変です。ただし、このプロパティにより、クラスに単純さと信頼性が追加されます。特に、複数のスレッド (実行スレッド) が同時にそのようなオブジェクトと対話している場合はそうです。

新しいLocalDateオブジェクトを作成するには、静的メソッドのいずれかを使用する必要があります。ここでは主なもののリストを示します。

現在の日付を取得する

現在の日付を取得するには、静的now()メソッドを使用する必要があります。これは見た目よりもはるかに簡単です。

LocalDate today = LocalDate.now();

ここで、todayLocalDate変数、 はクラスのLocalDate.now()静的メソッドの呼び出しです。now()LocalDate

例:

コード コンソール出力
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

特定のタイムゾーンの日付を取得する

このクラスには、特定のタイム ゾーンの現在の日付を取得できるメソッドLocalDateのバリエーションもあります。now(ZoneId)

ZoneIdこれを行うには、別のクラス、クラス (java.time.ZoneId)が必要です。タイムゾーンの名前を指定してオブジェクトof()を返すメソッドがあります。ZoneId

上海の現在の日付を確認するには、次のコードを記述する必要があります。

コード コンソール出力
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

すべてのタイムゾーンの名前のリストはインターネット上で見つけることができます。


3. 特定の日付を取得する

特定の日付を表すオブジェクトを取得するにはLocalDate、静的メソッドを使用する必要がありますof()。ここにあるものはすべて非常にシンプルかつ明確です。

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

ここで、dateLocalDate変数、 はクラスの静的メソッドの呼び出しです。LocalDate.of()of()LocalDate

ここでは、 2 月を月として指定するためにクラスFEBRUARYの定数(java.time.Month) が使用されていることがわかります。Month

昔ながらの方法 (数値を使用) で月を指定することもできます。

LocalDate date = LocalDate.of(2019, 2, 22);

二?2月の代わりに?ということは、また月が1から数えられることになるのでしょうか?

そうです、Java の作成から 20 年近くが経ち、ついに月が 0 から数えられなくなりました。

例:

コード コンソール出力
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

その日のインデックスから日付を取得する

日付を作成するもう 1 つの興味深い方法があります。このofYearDayメソッドを使用すると、年の番号とその年の日のインデックスのみに基づいて日付を取得できます。一般的な外観は次のとおりです。

LocalDate date = LocalDate.ofYearDay(year, day);

ここでyear、 は年の番号、dayはその年の日のインデックスです。

例:

コード コンソール出力
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

2019年の100日目は4月10日です。

Unix の日付を取得する

Date1970 年 1 月 1 日以来、オブジェクトは常に時間をミリ秒数として保存していたことを覚えていますか? プログラマが古き良き時代を懐かしまないように、このLocalDateクラスにはofEpochDay()1970 年 1 月 1 日から計算された日付を返すメソッドが追加されました。全体的な外観は次のとおりです。

LocalDate date = LocalDate.ofEpochDay(day);

ここで、dayは 1970 年 1 月 1 日から経過した日数です。

例:

コード コンソール出力
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. 日付の要素を取得する

オブジェクトを変更することはできませんLocalDateが、保存された日付の個々の要素を取得することはできます。LocalDateオブジェクトにはこれを行うためのメソッドがいくつかあります。

方法 説明
int getYear()
特定の日付の年を返します
Month getMonth()
日付の月を返します: いくつかの定数のうちの 1 つ
JANUARY, FEBRUARY, ...;
int getMonthValue()
日付の月のインデックスを返します。1月 == 1.
int getDayOfMonth()
月の日のインデックスを返します
int getDayOfYear()
年の初めからのその日のインデックスを返します
DayOfWeek getDayOfWeek()
曜日を返します: いくつかの定数のうちの 1 つ
MONDAY, TUESDAY, ...;
IsoEra getEra()
元号を返します: BCE(現在の元号以前) またはCE(現在の元号)

例:

コード コンソール出力
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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

このLocalDateクラスには、日付を操作できるメソッドがいくつか含まれています。これらのメソッドの実装はクラスのメソッドに似ていますString既存のオブジェクトは変更されませんLocalDateが、代わりに必要なデータを含む新しいオブジェクトが返されます。

クラスのメソッドは次のとおりですLocalDate

方法 説明
plusDays(int days)
指定した日数を日付に加算します
plusWeeks(int weeks)
日付に週を追加します
plusMonths(int months)
日付に月を加算します
plusYears(int years)
日付に年を加算します
minusDays(int days)
日付から日数を減算します
minusWeeks(int weeks)
日付から週を減算します
minusMonths(int months)
日付から月を減算します
minusYears(int years)
日付から年を減算します

例:

コード コンソール出力
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

birthday object呼び出すメソッドは変わりません。代わりに、そのメソッドは、必要なデータを含む新しいオブジェクトを返します。