/******************************************************************************
* Name: Kevin Wayne
* NetID: wayne
* Precept: P00
*
* Description: This mutable data type represents time on a 24-hour clock.
* You add one minute to the time on a clock or determine whether
* the time on one clock is earlier than the time on another.
*
* The test client takes two string command-line arguments start and stop;
* interprets them as times on a 24-hour clock; and prints all of the times
* in the interval [start, stop)
*
* % java Clock 12:30 12:35
* 12:30
* 12:31
* 12:32
* 12:33
*
* % java Clock 00:00 20:00
* 00:00
* 00:01
* 00:02
* ...
* 19:58
* 19:59
*
******************************************************************************/
public class Clock {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
private int hours; // the hour (between 0 and 23)
private int minutes; // the minute (between 0 and 59)
// creates a clock whose initial time is h hours and m minutes
public Clock(int h, int m) {
hours = h;
minutes = m;
validateTime(hours, minutes);
}
// creates a clock whose initial time is specified by the string argument
public Clock(String time) {
if (!time.matches("[0-9][0-9]:[0-9][0-9]")) {
throw new IllegalArgumentException("invalid time: " + time);
}
hours = Integer.parseInt(time.substring(0, 2));
minutes = Integer.parseInt(time.substring(3, 5));
validateTime(hours, minutes);
}
// throws an IllegalArgumentException h hours and m minutes is an invalid time
private static void validateTime(int h, int m) {
if (h < 0 || h >= HOURS_PER_DAY) {
throw new IllegalArgumentException("hours is invalid: " + h);
}
if (m < 0 || m >= MINUTES_PER_HOUR) {
throw new IllegalArgumentException("minutes is invalid: " + m);
}
}
// returns a string representation of this clock, using the format HH:MM
public String toString() {
return String.format("%02d:%02d", hours, minutes);
}
// adds 1 to the time of this clock
public void tic() {
minutes++;
if (minutes == MINUTES_PER_HOUR) {
minutes = 0;
hours++;
}
if (hours == HOURS_PER_DAY) {
hours = 0;
}
}
// is the time on this clock earlier than the time on that one?
public boolean isEarlierThan(Clock that) {
if (this.hours < that.hours) return true;
if (this.hours > that.hours) return false;
return this.minutes < that.minutes;
}
// tests all of the instance methods in this class
public static void main(String[] args) {
Clock start = new Clock(args[0]);
Clock stop = new Clock(args[1]);
for (Clock x = start; x.isEarlierThan(stop); x.tic()) {
StdOut.println(x);
}
}
}