2013-12-18 23 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