【问题标题】:Calculating time diffrence计算时差
【发布时间】:2013-09-05 16:03:40
【问题描述】:

我正在尝试计算日期之间的时间差异:

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;
}

由于某种原因,即使结束日期在开始日期之后,我也无法理解我展示的示例给出负输出。

有什么想法吗?

【问题讨论】:

  • 除了下面的答案之外,通常最好让函数采用他们感兴趣的实际参数;你的方法应该采用Dates,而不是Strings。这使得测试更容易(也许您的转换没​​有正常工作)并且使用起来更灵活。
  • @chrylis 而且,因为这可能会导致以后出现这种情况,有人将他的Date 实例转换为String,以便他可以调用此方法(然后将它们转换回Date )。这是完全不必要的。

标签: java simpledateformat


【解决方案1】:

正如其他人指出的精度损失,您可以阅读here 中的详细信息。

long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;  
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours   = diff / (60 * 60 * 1000) % 60;

Java 的日期时间 API 存在一些设计问题。日历不是线程安全的。你可能想看看Joda-Time。这将使它变得如此简单-

Seconds.between(startDate, endDate);

【讨论】:

【解决方案2】:

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

注意:在您的示例中,您还可以将 diffSecondsdiffMinutesdiffHours 保留为 int。但我不建议这样做,因为如果日期相距太远,这将是一个失败的解决方案。

【讨论】:

    【解决方案3】:

    尝试改变

    int diff = (int) d2.getTime() - (int)d1.getTime();
    

    long diff = d2.getTime() - d1.getTime();
    

    longint 的显式类型转换将导致精度损失,并可能导致减法为负值。

    long a = 90000000000000L;
    long b = 10000001000000L;
    
    a>b
    (int)a-(int)b => negative value
    

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多