System.currentTimeMillis()到int返回负值

时间:2017-09-17 10:56:40

标签: java android type-conversion

我正在开发一个应用程序,我在其中动态添加视图并分配使用的唯一ID,但它返回负值:

long time = System.currentTimeMillis();
view.setId((int)time);

所以我在google上搜索并找到了另一个解决方案但是它也没有用。它还返回负值:

Long time = System.currentTimeMillis();
view.setId(time.intValue());

那么如何安全地将System.currentTimeMills()返回的长值转换为int

System.currentTimeMills()返回1505645107314,转换为int时会返回-1888413582

4 个答案:

答案 0 :(得分:0)

当一个较大的long值投放到int时,该值将会更改。您可能希望将时间除以1000以获得以秒为单位的时间,或者从1天前的时间中减去该值(取决于您喜欢的唯一性)并将其用作视图的ID。

view.setId((int)(time/1000)); //this gives unique id for every second.

修改 使用以下代码获取每毫秒的唯一ID:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
long yesterday = calendar.getTimeInMillis();
int uniqueId = (int) (yesterday - System.currentTimeMillis());

答案 1 :(得分:0)

你无法做到。为什么你用时间作为唯一身份?不好的做法。

例如,2147483648将表示为-2147483648。对于小值,铸造就足够了:

long l = 42;
int i = (int) l;

但是,long可以包含的信息多于int,因此无法完全从long转换为int。情况下。

您可以将整数限制内的哈希值用作唯一ID。

答案 2 :(得分:0)

currentTimeMillis返回一个long,有时候不适合int。因此,我认为您不应该使用此方法为视图设置唯一的int ID。

如果您想为自己创建的每个视图创建一个唯一的int,请尝试这种方法,创建一个静态计数器:

static int nextViewID = 0;

创建新视图时,只需

view.setId(nextViewID);
nextViewID++;

如果你想要一个随机唯一整数,你可以这样做:

  • 创建静态Set
  • 使用java.util.Random
  • 生成随机整数
  • 尝试将号码添加到集
  • 继续生成另一个整数,直到您成功将数字添加到集合

答案 3 :(得分:0)

这很正常。在某些情况下,从大型数据类型(如long)转换为较小的数据类型(如int)可能会导致值的更改。您可以通过除以某个预设常量(例如10,000)来设计其他方法。例如:

Long t = System.currentTimeMillis() / 10000;
view.setId((int) t);

这肯定会给你一个积极的价值!