今天是2013年12月18日。
我正在测试这个程序,我希望通过从System.currentMillis()
添加/减去一些毫秒来获得另一个日期。当我在decembre中移动日期时效果很好但是对于某些类似的值它不能正常工作。例如,以下代码为我提供了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 :(得分:7)
这是问题所在:
((long)( 48 * 24 * 3600 * 1000))
这是以32位进行所有算术运算,然后将(现在截断的,因为结果对于int
来说太大)结果转换为long
。你想要:
48L * 24 * 3600 * 1000
其中L
后缀表示它将使用long作为值48。
但是,你确实根本不想这样做 - 你想使用Joda Time这是一个很多更好的API用于日期/时间工作。你真的不想乱用低级别的东西。
LocalDate date = ...;
LocalDate twoDaysLater = date.minusDays(48);
如果确实想要坚持使用内置API,请使用Calendar
。在至少使用TimeUnit
枚举,这将允许:
long millisFor48Days = TimeUnit.DAYS.toMillis(48);
您还需要考虑时区 - 虽然“今天”可能是12月18日,但它不是世界其他地方。