[英]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.