
public class MyTime {
private int hour;
private int minute;
private int second;
// 构造方法,用于初始化时间
public MyTime(int hour, int minute, int second) {
setTime(hour, minute, second); // 调用辅助方法来设置时间,确保时间合法
}
// 辅助方法:设置时间,同时确保时间合法(小时在0-23之间,分钟和秒在0-59之间)
private void setTime(int hour, int minute, int second) {
this.hour = (hour % 24 + 24) % 24; // 确保小时在0-23之间
this.minute = (minute + 60) % 60; // 确保分钟在0-59之间,处理负数情况
this.second = (second + 60) % 60; // 确保秒在0-59之间,处理负数情况
}
// 减少秒数的方法
public void subSecond(int second) {
this.second -= second;
adjustTime(); // 调用辅助方法来调整时间,处理借位
}
// 减少分钟数的方法
public void subMinute(int minute) {
this.minute -= minute;
adjustTime(); // 调用辅助方法来调整时间,处理借位
}
// 减少小时数的方法
public void subHour(int hour) {
this.hour -= hour;
this.hour = (this.hour + 24) % 24; // 确保小时在0-23之间,处理负数情况
// 注意:这里不需要调用adjustTime(),因为小时减少不会直接影响秒或分钟,除非它导致时间变为负数(但已通过取模运算处理)
}
// 辅助方法:调整时间,处理秒或分钟的借位
private void adjustTime() {
if (this.second < 0) {
this.second += 60; // 秒数变为负数时,从分钟借1分钟(即60秒)
this.minute -= 1;
if (this.minute < 0) {
this.minute += 60; // 分钟变为负数时,从小时借1小时(即60分钟)
this.hour -= 1;
if (this.hour < 0) {
this.hour += 24; // 小时变为负数时,通过加24小时来确保它在0-23之间(实际上这种情况在subHour中已经处理过,但这里为了完整性保留)
}
}
}
if (this.minute < 0) {
// 注意:这个条件在正常情况下不会触发,因为上面的if语句已经处理了分钟的借位。
// 但为了代码的健壮性,我们还是保留了这个检查(尽管它是多余的,因为上面的逻辑已经保证了minute不会是负数)。
// 在实际编程中,这样的冗余检查有时可以作为防御性编程的一部分。
this.minute += 60; // 如果因为某种原因minute仍为负数,则从这里借位(虽然这种情况理论上不会发生)。
this.hour -= 1;
if (this.hour < 0) {
this.hour += 24; // 同样,这个if语句也是冗余的,但为了完整性还是保留了。
}
}
// 注意:我们不需要对hour进行额外的检查,因为subHour方法已经通过取模运算处理了负数小时的情况。
}
// 重写toString方法,用于格式化输出时间
@Override
public String toString() {
return String.format("%02d:%02d:%02d", this.hour, this.minute, this.second);
}
public static void main(String[] args) {
// 初始化时间为 12:25:40
MyTime time = new MyTime(12, 25, 40);
// 减少80秒之后输出时间为:12:24:20
time.subSecond(80);
System.out.println(time); // 输出: 12:24:20
// 减少70分钟后输出时间为:11:14:20
time.subMinute(70);
System.out.println(time); // 输出: 11:14:20
// 减少25小时后输出时间为:10:14:20
time.subHour(25);
System.out.println(time); // 输出: 10:14:20
}
}