我试图从sql获取时间戳,需要计算两个时间戳之间的差异。
//startDate = 2014-07-10 16:07:00.0
//endDate = 2014-07-11 04:07:00.0
//END_DATE = 2014-07-18 08:07:00.0
private Timestamp calculateWflTime(String vehicleNum, Timestamp startDate,
Timestamp endDate) {
Timestamp t1 = new Timestamp (END_DATE.getTime()); //2014-07-18 08:07:00.0
Timestamp t2 = new Timestamp (startDate.getTime()); //2014-07-10 16:07:00.0
Timestamp wflTime = null;
long diff=0;
if(VEH_NUM == vehicleNum){
diff = t1.getTime()-t2.getTime();//diff(END_DATE,startDate);
}
wflTime = new Timestamp( Math.abs(diff/(1000*60*60*24)));
return wflTime; //1970-01-01 05:30:00.007
}
答案 0 :(得分:1)
表达式
new Timestamp( Math.abs(diff/(1000*60*60*24)));
从域的角度来看,在语义上是错误的。为什么?您尝试将一段时间(实际上是未固定在时间轴上的持续时间(以毫秒为单位))转换为此时固定的时间点,以便从UNIX纪元(1970-01-01)计算。这就像用几何术语将长度转换为点。
两个时间戳之间的差异不应该是新的时间戳,而只是一个持续时间(这里是你的差异变量,以毫秒为单位)。并且由您决定如何将其标准化为数年和数月。
清洁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
}
答案 1 :(得分:0)
Unix时间戳是一个用于描述时间瞬间的系统,定义为自1970年1月1日以来经过的秒数。
因此,如果您对其进行减法并对其进行转换,则会显示自1970年以来经过的时间。
答案 2 :(得分:0)
关于1970年的日期,通常所有日期都是一个数字,代表自1970年1月1日午夜以来的毫秒数,所以如果你显示相似日期之间的差异作为日期,那么你将在20世纪70年代获得一些东西。您需要将答案视为毫秒,并将时间,小时,分钟计算出来。希望这会有所帮助。
答案 3 :(得分:0)
无论如何我使用JodaTime库来计算两个时间戳之间的差异。谢谢大家的帮助。
作为解决方案,修改后的代码现在是:
private String calculateWflTime(String vehicleNum, Timestamp startDate,
Timestamp endDate) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String days = null, hours = null, minutes = null, seconds = null;
Date d1 = null;
Date d2 = null;
Timestamp wflTime = null;
if(VEH_NUM == vehicleNum){
String dateStart = END_DATE.toString();
String dateStop = startDate.toString();
try {
d1 = format.parse(dateStart);
d2 = format.parse(dateStop);
DateTime dt1 = new DateTime(d1);
DateTime dt2 = new DateTime(d2);
days = Days.daysBetween(dt1, dt2).getDays() + " days, ";
hours = Hours.hoursBetween(dt1, dt2).getHours() % 24 + " hours, ";
minutes = Minutes.minutesBetween(dt1, dt2).getMinutes() % 60 + " minutes, ";
seconds = Seconds.secondsBetween(dt1, dt2).getSeconds() % 60 + " seconds.";
} catch (Exception e) {
e.printStackTrace();
}
}
return days+hours+minutes+seconds;
}