簡體   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