Java Gold合格への道 ~日付/時刻API・日時の表示~
こんにちは。たろすです。
今回は日付/時刻APIの日時の表示について説明します。
定義済みフォーマッタによるフォーマット
以下のように使用します。
LocalDateTime dateTime = LocalDateTime.now(); DateTimeFormatter basicIsoDate = DateTimeFormatter.BASIC_ISO_DATE; System.out.println(basicIsoDate.format(dateTime));
20220121
定義済みフォーマッタの一覧は以下になります。
カスタムパターンによるフォーマット
ofPatterメソッドによって表示形式を指定します。
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy/M/d");
System.out.println(fomatter.format(dateTime));
2022/1/21
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メソッドなどを使って単位を指定します。
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
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
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)
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
Java Gold合格への道 ~アサーション~
こんにちは。たろすです。
今回はアサーションについて説明します。
使い方
public static void main(String[] args) { int x = 10; assert x == 5 : "NG"; System.out.println("OK"); }
アサーションを有効にするためには実行する際に「-ea」オプションをつけます。
(eaはenable assertionsの略です)
実行すると条件式がfalseになるため例外が投げられプログラムが終了します。
Exception in thread "main" java.lang.AssertionError: NG at assertion.Main.main(Main.java:7)
xの値を5にすると条件式がtrueになり、「OK」が出力されます。