当前毫秒,从long到int

时间:2011-11-23 15:01:31

标签: java

我目前有以下代码:

public static int currentTimeMillis()
{
    long millisLong = System.currentTimeMillis();
    while ( millisLong > Integer.MAX_VALUE )
    {
        millisLong -= Integer.MAX_VALUE;
    }
    return (int)millisLong;
}

int格式返回当前时间(不完全相同,但可以用于时差)。出于很好的理由,我无法使用long

是的,我只对两次通话之间的区别感兴趣,这种方法效果很好。但它看起来不错。我知道。并且效率低下。我知道。所以我的问题是,我该如何改进呢?

我需要一个返回int的函数,以便:

int x1 = currentTimeMillis(); //my function
long y1 = System.currentTimeMillis();

.....

int x2 = currentTimeMillis();
long y2 = System.currentTimeMillis();

// here, x2 - x1 must be equal to y2 - y1

编辑:

仅供参考,我想这样做以进行基准测试。我正在并行运行多个线程的测试,stop事件由外部组件触发。我也是以仅支持int的方式序列化数据,而我正在序列化的对象不能有long个成员。

5 个答案:

答案 0 :(得分:27)

您的功能基本上与以下内容相同:

public static int currentTimeMillis() {
    return (int) (System.currentTimeMillis() % Integer.MAX_VALUE);
}

以上可能就是你要找的东西。 modulus operator %返回分区的剩余部分。我只会将它包装在另一个隐藏它的类中。将“当前时间毫秒”作为具有错误值的int进行混淆是令人困惑的。类似的东西:

Stopwatch stopwatch = Stopwatch.start();

// ...

int elapsed = stopwatch.elapsed();

public final class Stopwatch {

    private long start;

    private Stopwatch() {
        start = System.currentTimeMillis();
    }

    public static Stopwatch start() {
        return new Stopwatch();
    }

    public int elapsed() {
        return (int) (System.currentTimeMillis() - start);
    }

}

当开始时间小于Integer.MAX_VALUE并且结束时间大于Integer.MAX_VALUE时,这也可以更好地防止出现问题,因此会溢出回Integer.MIN_VALUE并继续那里。

答案 1 :(得分:3)

请注意,如果currentTimeMillis值在Integer.MAX_VALUEx1之间翻过x2,则最终x2 - x1为负值。有两种方法可以解决这个问题。

  1. 使用BalusC的方法,然后当你减去x2 - x1时,检查它是否为负数。如果是,请再次向其添加Integer.MAX_VALUE。 (这假设不会检查实际超过Integer.MAX_VALUE距离的两个时间值。)
  2. 首次初始化类时,将当前时间存储为私有静态值。从那时起,让您的函数返回当前时间和第一个启动时间之间的差异。这假设在重新启动系统时不需要保留这些时间值,并且系统将无法存活足够长的时间来传递Integer.MAX_VALUE标记。
  3. 作为旁注,我相信我们都在想你不使用long值的理由是什么?

答案 2 :(得分:2)

你无法100%满足你的条件,因为在执行过程中你的程序行之间的时间可能会过去,这会让事情略有不同。但这些数字并没有太多关闭。在不了解您的问题的情况下,我不得不假设您对实际时间不感兴趣。也许你只对经过的时间感兴趣?你在运行一些基准测试吗?如果您只需要经过的时间,那么@BalusC建议的模数解决方案就可以了。

答案 3 :(得分:2)

而不是找到模数,更快的解决方案是简单的按位掩码操作:

public static int currentTimeMillis() {
    return (int) (System.currentTimeMillis() & 0x00000000FFFFFFFFL);
}

答案 4 :(得分:2)

你可以做到

public static int currentTimeMillis() {
    return (int) System.currentTimeMillis();
}

如果它是否定的,那么只要你有所作为就没关系。 e.g。

int start = currentTimeMillis();

// will be positive for differences less than 24 days.
int time = currentTimeMillis() - start; 

使用这种方法可以避免溢出问题,因为它们会取消,例如

int start = Integer.MAX_VALUE;
// 1 ms later
int time = Integer.MIN_VALUE /*due to overflow*/ - start; 
// time equals 1 due to underflow.