我正在尝试从sql获取时间戳,并且需要计算两个时间戳之间的差异。
最佳答案
表达方式
new Timestamp( Math.abs(diff/(1000*60*60*24)));
从域的角度来看在语义上是错误的。为什么?您尝试将时间量(实际上是一个持续时间,以毫秒为单位,未固定在时间轴上)转换为一个时间点,该时间点在此处已固定为从UNIX纪元(1970-01-01)开始计数。就像将长度转换为点一样。
两个时间戳之间的差异不应是新的时间戳,而应是一个持续时间(此处的diff变量以毫秒为单位)。而如何将其标准化到几年和几个月则取决于您。
OP回答后更新
干净的Joda解决方案:
public static void main(String... args) {
Timestamp t1 = new Timestamp(0);
Timestamp t2 = new Timestamp(86400000 + 7261000);
System.out.println(getDurationJoda(t1, t2));
// output: 1 day, 2 hours, 1 minute, 1 second.
}
public static String getDurationJoda(Timestamp start, Timestamp end) {
LocalDateTime ldtStart = new LocalDateTime(start);
LocalDateTime ldtEnd = new LocalDateTime(end);
Period p = new Period(ldtStart, ldtEnd, PeriodType.dayTime());
PeriodFormatter fmt =
new PeriodFormatterBuilder()
.appendDays().appendSuffix(" day, ", " days, ")
.appendHours().appendSuffix(" hour, ", " hours, ")
.appendMinutes().appendSuffix(" minute, ", " minutes, ")
.appendSeconds().appendSuffix(" second.", " seconds.").toFormatter();
return fmt.print(p);
}
Time4J解决方案
此外,您可以使用我的库Time4J进行此替换,该库包含一个可本地化的
PrettyTime
类,用于从1.2版开始的持续时间格式:private static final IsoUnit DAYS = CalendarUnit.DAYS;
private static final IsoUnit HOURS = ClockUnit.HOURS;
private static final IsoUnit MINUTES = ClockUnit.MINUTES;
private static final IsoUnit SECONDS = ClockUnit.SECONDS;
public static void main(String... args) {
Timestamp t1 = new Timestamp(0);
Timestamp t2 = new Timestamp(86400000 + 7261000);
System.out.println(getDurationTime4J(t1, t2));
// output: 1 day, 2 hours, 1 minute, and 1 second
}
public static String getDurationTime4J(Timestamp start, Timestamp end) {
PlainTimestamp startTS = TemporalTypes.SQL_TIMESTAMP.transform(start);
PlainTimestamp endTS = TemporalTypes.SQL_TIMESTAMP.transform(end);
Duration<?> duration =
Duration.in(DAYS, HOURS, MINUTES, SECONDS).between(startTS, endTS);
return PrettyTime.of(Locale.ENGLISH).print(duration, TextWidth.WIDE);
}
最后但并非最不重要的一点是,在格式化持续时间之前尝试评估您的字符串条件,并使用equals()代替==,例如:
if (VEH_NUM.equals(vehicleNum)) {
// call getDuration(..., ...)
} else {
// return zero duration string
}