Java 计算时间差
我试图计算日期之间的时间差:Java 计算时间差,java,simpledateformat,Java,Simpledateformat,我试图计算日期之间的时间差: public static void main(String args[]) { String start = "2013-03-10 10:28:47.000000"; String end = "2013-04-07 09:54:08.054577"; CalculateDuration calc = new CalculateDuration(); calc.calculateDiffrenceInMinutes(start,
public static void main(String args[])
{
String start = "2013-03-10 10:28:47.000000";
String end = "2013-04-07 09:54:08.054577";
CalculateDuration calc = new CalculateDuration();
calc.calculateDiffrenceInMinutes(start,end);
}
public int calculateDiffrenceInMinutes(String start_time, String end_time)
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(start_time);
d2 = format.parse(end_time);
} catch (ParseException e) {
e.printStackTrace();
}
// Get msec from each, and subtract.
int diff = (int) d2.getTime() - (int)d1.getTime();
int diffSeconds = (int) (diff / 1000);
int diffMinutes = (int) (diff / (60 * 1000));
int diffHours = (int) (diff / (60 * 60 * 1000));
return diffMinutes;
}
由于某些原因,我无法理解我显示的示例,即使结束日期在开始日期之后,也会给出一个否定的输出
有什么想法吗?试试换衣服
int diff = (int) d2.getTime() - (int)d1.getTime();
到
从long
到int
的显式类型转换将导致精度损失,并可能导致减法时出现负值
long a = 90000000000000L;
long b = 10000001000000L;
a>b
(int)a-(int)b => negative value
Date#getTime()
返回一个long
,这是有原因的。因为自1970年1月1日00:00:00 GMT以来已经过去了好几毫秒。一个int
不能容纳那个巨大的数字(并且溢出,这解释了为什么可能会得到负数(取决于两个日期))。因此,您应该使用long
进行计算
我会像这样更改您的代码:
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / ( 1000);
long diffMinutes = diff / ( 60 * 1000);
long diffHours = diff / (60 * 60 * 1000);
当然,您还需要将calculateDiffrenceInMinutes
方法的返回类型更改为long
注意:在您的示例中,您还可以将
diffSeconds
、diffMinutes
和diffHours
保留为int
。但我不建议这样做,因为如果日期相距太远,这将是一个失败的解决方案。正如其他人指出的精度损失,您可以在中阅读详细信息
Java的日期时间API存在一些设计问题。日历不是线程安全的。你可能想看看。这将使它变得简单-
Seconds.between(startDate, endDate);
除了下面的答案外,通常最好让函数采用它们感兴趣的实际参数;您的方法应该采用
Date
s,而不是String
s。这使测试变得更容易(可能是您的转换工作不正常),使用起来也更灵活。@chrylis还有,因为这可能会导致以后出现这样的情况:有人将其日期
实例转换为字符串
,以便调用此方法(然后将其转换回日期
)。这是完全不必要的。Java的日历怎么会“非常糟糕”?你能指出一些未解决的错误吗?这是一个大胆的回答。@VGR我不想写长消息。所以这里有一些答案可能会有所帮助。
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 60;
Seconds.between(startDate, endDate);