簡體   English   中英

使用Java將Unix時代轉換為人類可讀的日期不正確

[英]Incorrect date when converting unix epoch to human readable using Java

編輯:刪除了'* 1000'並仍然得到不正確的日期,但更新了下面的日志以顯示我現在得到的內容。

以下是我的代碼段和日志,我以為我正確實現了它,所以我不知道為什么它沒有給我正確的轉換:

NewFoodItem foodItem = data.get(position);
String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (foodItem.date));
String a =  Integer.toString(foodItem.date);
Log.d("returnedDate:", a);
Log.d("formattedDate:", date);

它不會讓我發布圖像,但日志如下所示:

D/returnedDate:  1409012824
D/formattedDate: 01/17/1970 02:23:32
D/returnedDate:  1409013004
D/formattedDate: 01/17/1970 02:23:33

我只是用一些假設進行了測試,看來問題與整數溢出有關

我假設您將NewFoodItem.date定義為int ,而不是long 因此,當您將date * 1000 (都為int )相乘時,它將返回int

int d = 1409012824; // foodItem.date
int d1000 = d * 1000; // returns 263550912 because of overflow, instead of 1409012824000

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 01/04/1970 08:42:30

當我嘗試將其中之一更改為long ,它的行為符合預期

// case 1
long d = 1409012824;
long d1000 = d * 1000; // now returns 1409012824000 correctly

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 08/26/2014 08:27:04

// case 2
int d = 1409012824;
long d1000 = d * 1000L; // note the "L" suffix to indicate the number as long 
long d1000f = d * 1000; // FAIL, still returns 263550912 because of integer overflow

String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000)); // returns 08/26/2014 08:27:04
String date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    .format(new Date(d1000f)); // returns 01/04/1970 08:42:30

通常,在Java中使用Date時,我們將它們定義的long因為通常它們以毫秒為單位。 為了易於維護,改變的類型NewFoodItem.date作為long是首選的一個; 如果也是毫秒也更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM