package timeToys;
import java.util.regex.Pattern;
**
* A DayTime is an immutable object that stores a moment of day represented in
* hour, minutes and seconds. Day or year are not defined.
*
* @author marius.costa <marius.costa@yahoo.com>
*/
public class DayTime {`enter code here`
private int hour;// hour of the day
private int minute;// minute of the hour
private int second;// second of the minute
private String time;// time as string
private static final String TIME_LONG_FORMAT = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";
private static final String TIME_SHORT_FORMAT = "([01]?[0-9]|2[0-3]):[0-5][0-9]";
/**
* Class private constructor that creates new objects using inner builder.
*
* @param timeBuilder - builder for new DayTime objects defined as inner class.
*/
private DayTime(Builder timeBuilder) {
this.hour = timeBuilder.hour;
this.minute = timeBuilder.minute;
this.second = timeBuilder.second;
this.time = timeBuilder. time;
}
public int getHour() {
return hour;
}
public int getMinute() {
return minute;
}
public int getSecond() {
return second;
}
@Override
public String toString() {
return time;
}
/**
* Builder is a inner class that creates new DayTime objects based on int params
* (hour, minute, second), or by parsing a String param formated as
* 'HH:mm' or 'HH:mm:ss'.
*/
public static class Builder {
private int hour = 0;
private int minute = 0;
private int second = 0;
private String time;
/**
* Constructor that creates a Builder from a String param formated as
* 'HH:mm' or 'HH:mm:ss'.
* @param time - must be formated as 'HH:mm' or 'HH:mm:ss'.
*/
public Builder(String time) {
this.time = time;
}
/**
* Creates a DayTime object from the String {@link #time}.
* The String {@code time} is innitialy parsed to validate time
* in 24 hours format with regular expression.
* If not, RuntimeExceptions will be thrown.
*
*
* @return DayTime
* @throws IllegalArgumentException if the string isn't right formated.
* @throws NumberFormatException if int values cannot be extracted from String time.
*/
public DayTime createTime() {
String[] timeUnits = time.split(":");
if(Pattern.compile(TIME_SHORT_FORMAT).matcher(time).matches()) {
this.hour = Integer.parseInt(timeUnits[0]);
this.minute = Integer.parseInt(timeUnits[1]);
} else if(Pattern.compile(TIME_LONG_FORMAT).matcher(time).matches()) {
this.hour = Integer.parseInt(timeUnits[0]);
this.minute = Integer.parseInt(timeUnits[1]);
this.second = Integer.parseInt(timeUnits[2]);
} else {
throw new IllegalArgumentException("Invalid time format" +
" (Expected format: 'HH:mm' or 'HH:mm:ss').");
}
return new DayTime(this);
}
}
}
答案 0 :(得分:12)
使用JodaTime。
答案 1 :(得分:11)
不要这样做。抵制编写自己的日期/时间代码的所有诱惑。它会咬你
使用标准日期类 - 即使它似乎是浪费
答案 2 :(得分:1)
您可以考虑添加方法:
equals()
hash()
并实现Comparable接口
int compareTo( Object other )
此外,建议使其不可变。
例如,如果您使用此类检查是否必须发生某些事情:
class Remainder {
private String what;
private DateTime when;
public static Remainder remindMe( String what, DateTime when ) {
Reminder r = new Reminder();
r.what = what;
r.when = when;
}
public boolean isTimeAlready() {
//return DateTime.Builder.createTime().compareTo( this.when ) > 0;
// implemented somehow
return isCurrentTimeGreaterThan( this.when ); // assume it return true if current time is after "when"
}
}
如果你这样使用它:
DateTime atSix = new DateTime( 18, 0, 0 );
Reminder reminder = Reminder.remindMe("Go for the milk", atSix );
小时改变(当然是错误的)
atSix.setHour( 1 );
“Reminder”对象对变量when
是私有的没有任何用处,因为它的引用被保留在外面并且无法控制它,因此它变得不可靠。
这可能是你可能会介绍的一个非常奇怪的错误。使用不可变对象不容易出错。这就是为什么Java中的核心对象,如String,Integer和其他许多对象都是不可变的。
如果你能阅读这本书:Effective Java它将在Java视角下转向180度。
答案 3 :(得分:0)
查看http://veyder-time.enblom.org - 一个强大而简单的java.util,joda-time等替代方案。