トラック
/
Java
Java
/
演習
/
美容の予約
美容の予約

美容の予約

学習演習

はじめに

日付と時刻

Java 8で導入されたjava.timeパッケージには、日付と時刻を扱うためのいくつかのクラスが含まれています。

LocalDate

java.time.LocalDateクラスは、ISO-8601の暦体系における、タイムゾーンのない日付を表します。たとえば2007-12-03のようなものです。

LocalDate date = LocalDate.of(2007, 12, 3);

日付はほかの日付と比較できます。

LocalDate date1 = LocalDate.of(2007, 12, 3);
LocalDate date2 = LocalDate.of(2007, 12, 4);

date1.isBefore(date2);
// => true

date1.isAfter(date2);
// => false

LocalDateのインスタンスには、日付の各部分を取り出すためのゲッターがあります。

LocalDate date = LocalDate.of(2007, 12, 3);

date.getDayOfMonth();
// => 3

LocalDateのインスタンスには、時間の単位を加えるためのメソッドがあります。

Note

これらのメソッドは_新しい_LocalDateのインスタンスを返すだけで、既存のインスタンスは更新しません。LocalDateクラスはイミュータブルだからです。

LocalDate date = LocalDate.of(2007, 12, 3);

date.plusDays(3);
// => 2007-12-06

LocalDateTime

java.time.LocalDateTimeクラスは、ISO-8601の暦体系における、タイムゾーンのない日時を表します。たとえば2007-12-03T10:15:30のようなものです。

LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);

LocalDateのインスタンスは、LocalDateTimeに変換できます。

LocalDate date = LocalDate.of(2007, 12, 3);
LocalDateTime datetime = date.atTime(10, 15, 30);
datetime.toString();
// => "2007-12-03T10:15:30"

日時のフォーマット

LocalDateとLocalDateTimeはどちらも、Stringとの相互変換にISO-8601の標準表記を使います。

LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
LocalDateTime parsed = LocalDateTime.parse("2007-12-03T10:15:30");

datetime.isEqual(parsed);
// => true

このように、異なるフォーマットを使ってStringからLocalDateやLocalDateTimeをパースすることはできません。 代わりに、独自のフォーマットで日付をフォーマットするには、java.time.format.DateTimeFormatterを使います。

DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", parser);

DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"

独自のフォーマットを作成するときにロケールを指定すれば、地域に合わせたフォーマットやパースもできます。

DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.FRENCH).format(date);
// => décembre 3, 2007

DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.of("pt")).format(date);
// => dezembro 3, 2007

説明

この演習では、2012年9月15日にニューヨークでオープンした美容サロンの予約スケジューラーを作ります。

1. 予約日時を解析する

AppointmentScheduler.schedule()メソッドを実装して、予約日時のテキスト表現を対応するLocalDateTimeに解析しましょう。

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.schedule("7/25/2019 13:45:00");
// => LocalDateTime.of(2019, 7, 25, 13, 45, 0)

2. 予約がすでに過ぎているかどうかを確認する

予約日時を受け取り、その予約が過去のものかどうかを確認するAppointmentScheduler.hasPassed()メソッドを実装しましょう。

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.hasPassed(LocalDateTime.of(1999, 12, 31, 9, 0, 0));
// => true

3. 予約が午後かどうかを確認する

予約日時を受け取り、その予約が午後(12:00以降、18:00より前)かどうかを確認するAppointmentScheduler.isAfternoonAppointment()メソッドを実装しましょう。

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.isAfternoonAppointment(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => true

4. 予約の日時を説明する

予約日時を受け取り、その日時の説明を返すAppointmentScheduler.getDescription()メソッドを実装しましょう。

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getDescription(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => "You have an appointment on Friday, March 29, 2019, at 3:00 PM."

5. 記念日を返す

今年の記念日である9月15日を返すAppointmentScheduler.getAnniversaryDate()メソッドを実装しましょう。

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getAnniversaryDate()
// => LocalDate.of(<current year>, 9, 15)
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Java Exercism

美容の予約を始める準備はできましたか?

Exercismに登録すれば、26個のコンセプト158個の演習、そして本物の人間によるメンタリングとともに、Javaを学んでマスターできます。すべて無料です。