我正在尝试从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
}

10-05 22:07