繁体   English   中英

System.currentTimeMillis()为int返回负值

[英]System.currentTimeMillis() to int returns negative value

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

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

因此,我在Google上搜索并找到了另一种解决方案,但是它也不起作用。 它还返回负值:

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

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

System.currentTimeMills()返回1505645107314而转换为int返回-1888413582

当将大的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());

你做不到 为什么将时间用作唯一ID? 不好的方法。

例如, 2147483648将被表示为-2147483648 对于较小的值,强制转换就足够了:

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

但是, long可以容纳比int更多的信息,因此在一般情况下,不可能完全将long转换为int

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

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

如果要为创建的每个视图都拥有唯一的int ,请尝试这种方法,并创建一个静态计数器thing:

static int nextViewID = 0;

创建新视图时,您只需

view.setId(nextViewID);
nextViewID++;

如果您想要一个随机的唯一整数,则可以执行以下操作:

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

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

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

这肯定会给您带来积极的价值!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM