talosのプログラミング教室

Java Gold合格への道 ~日付/時刻API・Instant~

こんにちは。たろすです。

今回は日付/時刻APIのInstantについて説明します。

Instantとは

Instantは1970年1月1日0時0分0秒からの経過秒数(エポック数)を保持するクラスです。

Instantオブジェクトの生成

LocalDateTimeなどと同様にnowメソッドで現在の日時を取得できます。

System.out.println(Instant.now());
2022-01-21T04:34:20.664Z


その他の日時オブジェクトからはtoInstantメソッドによって取得できます。

System.out.println(LocalDateTime.now().toInstant(ZoneOffset.ofHours(0)));
2022-01-21T13:34:20.717Z


ofEpochSecondメソッドやofEpochMilliメソッドを使うことによってエポックから引数の分だけ経過した日時を取得できます。

System.out.println(Instant.ofEpochMilli(0));
1970-01-01T00:00:00Z

おわりに

今回は日付/時刻APIのInstantについて説明しました。

Java Gold合格への道 ~日付/時刻API・日時の表示~

こんにちは。たろすです。

今回は日付/時刻APIの日時の表示について説明します。

定義済みフォーマッタによるフォーマット

以下のように使用します。

LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter basicIsoDate = DateTimeFormatter.BASIC_ISO_DATE;
System.out.println(basicIsoDate.format(dateTime));
20220121

定義済みフォーマッタの一覧は以下になります。

f:id:talosta:20220121115403p:plain
DateTimeFormatter (Java Platform SE 8)参照

カスタムパターンによるフォーマット

ofPatterメソッドによって表示形式を指定します。

LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy/M/d");
System.out.println(fomatter.format(dateTime));
2022/1/21

おわりに

今回は日付/時刻APIの日時の表示について説明しました。

Java Gold合格への道 ~日付/時刻API・時間の計算~

こんにちは。たろすです。

今回は日付/時刻APIの時間の計算について説明します。

加算

加算する方法は二通りあります。

LocalDate date = LocalDate.of(2022, 1, 1);
System.out.println(date.plus(5, ChronoUnit.DAYS));
System.out.println(ChronoUnit.DAYS.addTo(date, 5));
2022-01-06
2022-01-06

一つはplusメソッドを使う方法です。

一つ目の引数には加算する量、二つ目の引数には単位が入ります。


もう一つはaddToメソッドを使う方法です。

DAYSが単位で、一つ目の引数には加算の対象となるオブジェクト、二つ目の引数には加算する量が入ります。

減算

減算する方法は基本的には一通りです。

LocalDate date = LocalDate.of(2022, 1, 1);
System.out.println(date.minus(5, ChronoUnit.DAYS));
2021-12-27

minusメソッドはplusメソッドと対応する減算のメソッドです。

plusメソッドやaddToメソッドの加算する量をマイナスにすれば減算ができますが、ややこしいので避けた方がよいでしょう。

期間の計算

日付

日付の間隔の計算をする方法は三通りあります。

LocalDate date1 = LocalDate.of(2022, 1, 1);
LocalDate date2 = LocalDate.of(2022, 1, 10);
System.out.println(date1.until(date2, ChronoUnit.DAYS));
System.out.println(ChronoUnit.DAYS.between(date1, date2));
System.out.println(Period.between(date1, date2).getDays());
9
9
9

一つ目はuntilメソッドです。

一つ目の引数には対象となる日付オブジェクト、二つ目の引数には単位が入ります。


二つ目はChronoUnitクラスのbetweenメソッドです。

DAYSが単位で、一つ目の引数には期間の始めの日付オブジェクト、二つ目の引数には期間の終わりの日付オブジェクトが入ります。


三つ目はPeriodクラスのbetweenメソッドです。

一つ目の引数には期間の始めの日付オブジェクト、二つ目の引数には期間の終わりの日付オブジェクトが入ります。

Peroioクラスには単位の概念がないのでgetDaysメソッドなどによってどの単位で取得するか指定する必要があります。

時刻

時刻の間隔の計算をする方法も三通りあります。

LocalDateTime time1 = LocalDateTime.of(2022, 1, 1, 0, 0);
LocalDateTime time2 = LocalDateTime.of(2022, 1, 1, 12, 0);
System.out.println(time1.until(time2, ChronoUnit.HOURS));
System.out.println(ChronoUnit.HOURS.between(time1, time2));
System.out.println(Duration.between(time1, time2).toHours());
12
12
12

上二つに関しては日付の期間の計算と同じです。

注意すべきは日付の計算にはPiriodではなくDuraitionを使用することです。

Duraitionも単位の概念がないのでtoHoursメソッドなどを使って単位を指定します。

おわりに

今回は日付/時刻APIの時間の計算について説明しました。

Java Gold合格への道 ~日付/時刻API・from~

こんにちは。たろすです。

今回は日付/時刻APIのfromについて説明します。

使い方

fromメソッドは日時を表すオブジェクトから別の日時を表すオブジェクトを取得する際に利用します。

LocalDateTime now = LocalDateTime.now();
System.out.println(LocalDate.from(now));
2022-05-03

注意点

情報が多い日時オブジェクトから情報が小さい日時オブジェクトの取得(例:LocalDateTimeからLocalDate)はできますが、逆はできません。

例外がスローされます。

LocalDateTime now = LocalDateTime.now();
System.out.println(ZonedDateTime.from(now));
Exception in thread "main" java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: 2022-01-19T18:09:46.073 of type java.time.LocalDateTime
	at java.time.ZonedDateTime.from(ZonedDateTime.java:565)
	at from.Main.main(Main.java:15)
Caused by: java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: 2022-01-19T18:09:46.073 of type java.time.LocalDateTime
	at java.time.ZoneId.from(ZoneId.java:466)
	at java.time.ZonedDateTime.from(ZonedDateTime.java:553)
	... 1 more

おわりに

今回は日付/時刻APIのfromについて説明しました。

Java Gold合格への道 ~日付/時刻API・日時の比較~

こんにちは。たろすです。

今回は日付/時刻APIにおける日時の比較について説明します。

isAfter

isAfterメソッドは引数の日時と比べて後であればtrueを返します。

LocalDate date = LocalDate.of(2022, 1, 1);
System.out.println("2022/1/1 is after 2022/1/5 ⇒ " + date.isAfter(LocalDate.of(2022, 1, 5)));
System.out.println("2022/1/1 is after 2021/12/5 ⇒ " + date.isAfter(LocalDate.of(2021, 12, 5)));
2022/1/1 is after 2022/1/5 ⇒ false
2022/1/1 is after 2021/12/5 ⇒ true

isBefore

isBeforeメソッドは引数の日時と比べて前であればtrueを返します。

LocalDate date = LocalDate.of(2022, 1, 1);
System.out.println("2022/1/1 is before 2022/1/5 ⇒ " + date.isBefore(LocalDate.of(2022, 1, 5)));
System.out.println("2022/1/1 is before 2021/12/5 ⇒ " + date.isBefore(LocalDate.of(2021, 12, 5)));
2022/1/1 is before 2022/1/5 ⇒ true
2022/1/1 is before 2021/12/5 ⇒ false

isEqual

isEqualメソッドは引数の日時と比べて同じであればtrueを返します。

LocalDate date = LocalDate.of(2022, 1, 1);
System.out.println("2022/1/1 is equeal 2022/1/1 ⇒ " + date.isEqual(LocalDate.of(2022, 1, 1)));
System.out.println("2022/1/1 is equal 2021/12/5 ⇒ " + date.isEqual(LocalDate.of(2021, 12, 5)));
2022/1/1 is equeal 2022/1/1 ⇒ true
2022/1/1 is equal 2021/12/5 ⇒ false

おわりに

今回は日付/時刻APIにおける日時の比較について説明しました。

Java Gold合格への道 ~日付/時刻API・列挙体~

こんにちは。たろすです。

今回は日付/時刻APIで定義されている列挙体について説明します。

曜日

曜日はDayOfWeekで定義されています。

for (DayOfWeek dayOfWeek : DayOfWeek.values()) {
	System.out.println(dayOfWeek);
}
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

月はMonthで定義されています。

for (Month month : Month.values()) {
	System.out.println(month);
}
JANUARY
FEBRUARY
MARCH
APRIL
MAY
JUNE
JULY
AUGUST
SEPTEMBER
OCTOBER
NOVEMBER
DECEMBER

LocalDateのなど日付を表現するクラスでは、月の引数にはMonth型をとれるようにオーバーロードされています。

LocalDate.of(2022, Month.APRIL, 26)

おわりに

今回は日付/時刻APIの列挙体について説明しました。

Java Gold合格への道 ~日付/時刻API・日時の取得~

こんにちは。たろすです。

今回は日付/時刻APIの日時の取得について説明します。

日付/時刻の種類

時差情報を含まない現地日時をローカルタイムと呼びます。

それを表現するクラスは以下の三つです。

・LocalDate(日付のみ)
・LocalTime(時刻のみ)
・LocalDateTime(日付と時刻)


一方で、時差情報を含む日時をオフセットタイムと呼びます。

オフセットタイムは以下の二つのクラスによって表現されます。

・OffsetTime(時刻のみ)
・OffsetDateTime(日付と時刻)


またタイムゾーンによる時差を扱うクラスもあります。

このクラスではサマータイムも考慮することができます。

・ZonedDateTime


そして、年、年月、月日を扱うクラスもあります。

・Year(年)
・YearMonth(年月)
・MonthDay(月日)

現在の日時を取得

現在の日時を取得するにはnowメソッドを使います。

System.out.println("LocalDate:" + LocalDate.now());
System.out.println("LocalTime:" + LocalTime.now());
System.out.println("LocalDateTime:" + LocalDateTime.now());
System.out.println("OffsetTime" + OffsetTime.now());
System.out.println("OfsetDateTime:" + OffsetDateTime.now());
System.out.println("ZonedDateTime:" + ZonedDateTime.now());
System.out.println("Year:" + Year.now());
System.out.println("YearMonth:" + YearMonth.now());
System.out.println("MonthDay:" + MonthDay.now());
LocalDate:2022-01-15
LocalTime:15:29:19.899
LocalDateTime:2022-01-15T15:29:19.899
OffsetTime15:29:19.903+09:00
OfsetDateTime:2022-01-15T15:29:19.903+09:00
ZonedDateTime:2022-01-15T15:29:19.903+09:00[Asia/Tokyo]
Year:2022
YearMonth:2022-01
MonthDay:--01-15

特定の日時を取得

特定の日時を取得するにはofメソッドを使います。

System.out.println("LocalDate:" + LocalDate.of(2022, 4, 22));
System.out.println("LocalTime:" + LocalTime.of(18, 10, 25));
System.out.println("LocalDateTime:" + LocalDateTime.of(2022, 4, 22, 18, 10, 25));
System.out.println("OffsetTime" + OffsetTime.of(18, 10, 25, 0, ZoneOffset.ofHours(9)));
System.out.println("OfsetDateTime:" + OffsetDateTime.of(2022, 4, 22, 18, 10, 25, 0, ZoneOffset.ofHours(9)));
System.out.println("ZonedDateTime:" + ZonedDateTime.of(2022, 4, 22, 18, 10, 25, 0, ZoneId.of("Asia/Tokyo")));
System.out.println("Year:" + Year.of(2022));
System.out.println("YearMonth:" + YearMonth.of(2022, 4));
System.out.println("MonthDay:" + MonthDay.of(4, 22));
LocalDate:2022-04-22
LocalTime:18:10:25
LocalDateTime:2022-04-22T18:10:25
OffsetTime18:10:25+09:00
OfsetDateTime:2022-04-22T18:10:25+09:00
ZonedDateTime:2022-04-22T18:10:25+09:00[Asia/Tokyo]
Year:2022
YearMonth:2022-04
MonthDay:--04-22

文字列から日付インスタンスを取得

日付インスタンスを取得するにはparseメソッドを使います。

例としてLocalDateTimeインスタンスを取得するコードを示します。

LocalDateTime dt = LocalDateTime.parse("2022-04-22T18:10:25.000");
System.out.println(dt);
2022-04-22T18:10:25

おわりに

今回は日付/時刻APIの日時の取得について説明しました。