轨道
/
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. 检查预约是否在下午

实现 AppointmentScheduler.isAfternoonAppointment() 方法,它接收一个预约日期,检查该预约是否在下午(>= 12:00 且 < 18:00):

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. 返回周年纪念日

实现 AppointmentScheduler.getAnniversaryDate() 方法,它返回今年的周年纪念日,也就是 9 月 15 日:

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getAnniversaryDate()
// => LocalDate.of(<current year>, 9, 15)
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Java Exercism

准备好开始 预约美容 了吗?

注册 Exercism,借助 26 个概念158 个练习 和真人导师指导,学习并掌握 Java,全部免费。