11.8 时间相加

假设你要去看电影,影片开始放映的时间为 18:50(6:50PM),时长为 2 小时 16 分钟,请问影片将在什么时候结束?

我们用 Time 对象来执行这种计算。可采取下面两种方式将 Time 对象“相加”:

  • 编写一个将两个 Time 对象作为参数的静态方法;

  • 编写一个通过 Time 对象进行调用,并将一个 Time 对象作为参数的实例方法。

为说明差别,我们将演示这两种方式。静态方法的代码类似于下面这样:

  1. public static Time add(Time t1, Time t2) {
  2. Time sum = new Time();
  3. sum.hour = t1.hour + t2.hour;
  4. sum.minute = t1.minute + t2.minute;
  5. sum.second = t1.second + t2.second;
  6. return sum;
  7. }

下面的代码演示了如何调用这个静态方法:

  1. Time startTime = new Time(18, 50, 0.0);
  2. Time runningTime = new Time(2, 16, 0.0);
  3. Time endTime = Time.add(startTime, runningTime);

另一方面,实例方法的代码类似于下面这样:

  1. public Time add(Time t2) {
  2. Time sum = new Time();
  3. sum.hour = this.hour + t2.hour;
  4. sum.minute = this.minute + t2.minute;
  5. sum.second = this.second + t2.second;
  6. return sum;
  7. }

所做的修改如下。

  • 删除了关键词 static

  • 删除了第一个形参。

  • t1 替换成了 this

还可以将 t2 替换为 that。不同于 thisthat 并非关键词,而只是一个比 t2 更合适的变量名。

下面的代码演示了如何调用这个实例方法:

  1. Time endTime = startTime.add(runningTime);

这就是将时间相加的静态方法和实例方法。静态方法和实例方法的功能相同,要想在它们之间转换,只需要修改几个地方。

然而,还有一个问题,那就是执行加法的代码不正确。就这个示例而言,返回的结果为 20:66,这并非有效的时间。如果 second 超过了 59,那么就必须进位到 minute,而如果 minute 超过了 59,就必须进位到 hour

下面是一个更佳的 add 版本:

  1. public Time add(Time t2) {
  2. Time sum = new Time();
  3. sum.hour = this.hour + t2.hour;
  4. sum.minute = this.minute + t2.minute;
  5. sum.second = this.second + t2.second;
  6. if (sum.second >= 60.0) {
  7. sum.second -= 60.0;
  8. sum.minute += 1;
  9. }
  10. if (sum.minute >= 60) {
  11. sum.minute -= 60;
  12. sum.hour += 1;
  13. }
  14. return sum;
  15. }

然而,hour 也可能超过 23,但 Time 类没有属性 days,因此无法进位。在 hour 超过 23 时,可用 sum.hour -= 24 来获得正确的结果。