1. 程式人生 > >關於Date型別轉換成毫秒數會出現誤差

關於Date型別轉換成毫秒數會出現誤差

public class DateTest {
    public static void main(String[] args) {
        //獲取本週一開始時間
        Calendar cal = Calendar.getInstance();  
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);  
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        System.out
.println(cal.getTime()); } }

控制檯會輸出本週一的開始時間

Mon Apr 24 00:00:00 CST 2017

這樣Date型別的資料是沒錯的,但是當把這個時間轉換成毫秒數時就會出錯了。
我寫這個程式碼的時候是2017年4月25日,週一的真正開始時間毫秒數為
1492963200000。

public static void main(String[] args) {
        //獲取本週一開始時間
        Calendar cal = Calendar.getInstance();  
        cal.set(cal.get(Calendar.YEAR
), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0); cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //獲得毫秒數 System.out.println(cal.getTime().getTime()); }

執行程式碼你會發現,你獲得的毫秒數並非1492963200000,而是會出現誤差,每次執行的結果都不一樣。比如:輸出如下資料

1492963200592
1492963200789

我是因為做需求的時候要判斷取出來的時間是否小於本週一開始時間,小於的話意味著該資料為本週之前的時間。結果碰到了剛好為本週一開始的時間,判斷就出現了問題,這樣才發現問題。

不只是這個查詢本週一的時間毫秒數會出現偏差,只要你用cal來查詢本週本月本年的日期都會出現問題。

你可以選擇這麼寫就不會有問題了,以獲取當天24點時間為例

public class DateTest {
    public static void main(String[] args) {
        //獲取今天24點時間
        Calendar cal = Calendar.getInstance();  
        cal.set(Calendar.HOUR_OF_DAY, 24);  
        cal.set(Calendar.SECOND, 0);  
        cal.set(Calendar.MINUTE, 0);  
        cal.set(Calendar.MILLISECOND, 0); 
        //獲得毫秒數
        System.out.println(cal.getTime().getTime());
    }
}

建議:判斷日期可以直接用date的before、after來比較就可以。這兩個方法其實本質上用的也是毫秒數來比較,只是做了封裝了。
date型別不能不能用大小於來比較,要用before、after來比較。
if(date1>date2){};這種寫法是錯誤的。