2013-12-18 24 views
1

今天是2013年12月18日。通過添加減去毫秒數來獲取正確的日期

我正在測試這個程序,我想通過從System.currentMillis()增加/減去數毫秒來得到另一個日期。當我在德布爾轉換日期時效果很好,但對於一些相似的值卻無法正確運行。例如下面的代碼給我2013 12 20作爲結果!我想知道,不,我還在想如何可能!或者我犯了一個錯誤?

public class CreateDirFiles { 


    public static final String PLOG_DIR = "ProductLog"; 

    private SimpleDateFormat dateFormatter = new SimpleDateFormat(); 

    public CreateDirFiles() { 
    } 

    public void createDayDir(Date date){ 
     dateFormatter.applyPattern("YYYY"); 
     String year = dateFormatter.format(date); 
     dateFormatter.applyPattern("MM"); 
     String month = dateFormatter.format(date); 
     dateFormatter.applyPattern("dd"); 
     String day = dateFormatter.format(date); 
     System.out.printf("%s %s %s\n", year, month, day); 
    } 

    public static void main(String... args){ 
     CreateDirFiles dfc = new CreateDirFiles(); 
     dfc.createDayDir(new Date(System.currentTimeMillis() - 
       ((long)(48 * 24 * 3600 * 1000)))); 
    } 
} 
+0

你正在重新發明車輪。使用'日曆'代替。 – m0skit0

+0

無論如何,它應該很好地工作新的日期(毫秒)尚未棄用!使用日期或日曆不是主題。 – Johnny

+0

不,它不適用於日期,因爲日期無法添加/減少時間。日曆確實。 – m0skit0

回答

7

這就是問題所在:

((long)(48 * 24 * 3600 * 1000)) 

這是做所有的運算在32位,然後轉換(現在的截斷,作爲結果是一個int過大)造成的long 。你想:

48L * 24 * 3600 * 1000 

其中L後綴意味着它會用很長的價值48

但是,你真的不希望這樣做的話 - 你想使用Joda Time這是一個更好的API日期/時間工作。你真的不想亂搞低層次的東西。

LocalDate date = ...; 
LocalDate twoDaysLater = date.minusDays(48); 

如果你真的堅持使用內置的API,然後使用Calendar。在最起碼使用TimeUnit枚舉,這將使:

long millisFor48Days = TimeUnit.DAYS.toMillis(48); 

您還需要考慮的時區 - 而「今天」可能是12月18日對你來說,它不是在別處世界。

+0

如果他只是使用「日曆」而不是試圖重新發明輪子,應該避免這種情況。 – m0skit0

+0

@ m0skit0:或者Joda時間,就像我現在推薦的那樣。 –

+0

我更喜歡JodaTime,但它也意味着額外的依賴。 – m0skit0