---实际上,有一个更好的方法来做到这一点,但如果你想使用日期,跳到编辑前的答案---
日期实际上并没有做你想做的事情,这似乎是一个外部的时间计算实际上需要选择真实世界日历的时间。
为了避免所有日期为了跟上公历而必须做的恶劣的特殊处理,你最好写自己的班级。这种特殊处理包括(但不限于)时区的认识,夏令,宣称“跳过天”,闰秒,闰年等
public TimeOnly {
private long timestamp;
private int millis;
private int seconds;
... etc ...
public TimeOnly(int hours, int minutes, int seconds, int millis) {
this.timestamp = millis + seconds * 1000L + minutes * 60000L + hours * 3600000L;
this.millis = millis;
this.seconds = seconds;
... etc ...
}
private TimeOnly(long timestamp) {
this.timestamp = timestamp;
this.millis = timestamp % 1000;
this.seconds = timestamp % 60000L - this.millis;
... etc ...
}
public long getTimestamp() {
return timestamp;
}
public int getMillis() {
return millis;
}
public int getSeconds() {
return seconds;
}
... etc ...
}
public TimeFormatter {
public TimeFormatter() {
}
public String format(Time time) {
StringBuilder builder = new StringBuilder();
builder.append(String.valueOf(time.getHours()));
builder.append(":");
builder.append(String.valueOf(time.getMinutes()));
builder.append(":");
builder.append(String.valueOf(time.getSeconds()));
builder.append(".");
if (time.getMillis() < 10) {
builder.append("00");
} else if (time.getMillis() < 100) {
builder.append("0");
}
builder.append(time.getMillis());
return builder.toString();
}
这种解决方案可能看起来就像是重新发明轮子,但真的是避免使用八角形作为车轮。日期的行为似乎并不是你想要的,尽管你可能会让日期适用于某些有限范围的值。
如果你想得到真正的幻想,你可以使上述的实现可比较等,但是,我会建议反对的东西。在施工后不要提供更新方法,因为这会迫使一些相当不好的重新计算,并使代码更难以维护。而应提供返回新TimeOnlys以回应您希望实施的操作的方法。
public TimeOnly addSeconds(int value) {
int stamp = this.timestamp;
stamp += value * 60000L;
if (stamp < timestamp) {
throw new Excepton("overflow");
}
return new TimeOnly(stamp);
}
此外,不要实现你不打算使用。未使用的代码往往是臭虫的肥沃土壤。
当然,所有“时间”事物的股票答案都考虑使用JodaTime,它区分了所有不同类型的时间度量。但是,对于这样的小问题,就像使用坦克杀死一只蚂蚁一样。
---预编辑答案---
没有时间完整的规范(年,月,日,时,分,秒,毫秒)的时间值作为第一步格式化将会有很多未指定的字段。这些领域的进展可能会是垃圾。
然后getTime()
作用于整个Date
对象将有效字段和垃圾翻译成值,其中垃圾甚至可以修改有效值(96秒= 1分36秒,因为字段相互作用)。
最好的办法是将所有“仅限时间”日期初始化为一个已知日期,因此当您进行比较和数学运算时(即,3 11 23
> ?),您会得到一致的结果(是的, 3 11 23
>1 02 10
,因为它实际上是2013 02 10 00 03 11 23
>2013 02 10 00 03 11 23
和不2013 02 10 00 03 11 23
相比2000 02 10 00 03 11 23
当选择天使用,避免相邻2月29日天,天是邻近夏令换档等
它是可能是SimpleTimeFormat类尝试兑现当前的时区设置,这需要将时间转换成1970年1月1日00:mm:ss之前的某个时间。由于时代会在时间之后(并且在那里也存在双重投射,这没有帮助),所以它可能会漂移到小范围的内部无效值中,导致外部无效值。你可能会把它称为一个错误,但很难让它对其声明的有效范围以外的时间负责。 – 2013-02-21 14:36:19
@EdwinBuck编辑。 – Dukeling 2013-02-21 15:10:02
非常感谢Dukeling :)它现在完美运行... – user2052015 2013-02-21 15:39:04