通过添加减去数毫秒来获得正确的日期

Joh*_*nny 1 java date simpledateformat

今天是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)) ));
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

这就是问题:

((long)( 48 * 24 * 3600 * 1000))
Run Code Online (Sandbox Code Playgroud)

那是在32位中进行所有算术运算,然后将(现在被截断的,因为int结果对于a 来说太大)的结果转换为a long.你要:

48L * 24 * 3600 * 1000
Run Code Online (Sandbox Code Playgroud)

其中L后缀表示它将使用long表示值48.

但是,你真的不希望这样做的话-要使用约达时间是一个很大的日期/时间的工作更好的API.你真的不想乱用低级别的东西.

LocalDate date = ...;
LocalDate twoDaysLater = date.minusDays(48);
Run Code Online (Sandbox Code Playgroud)

如果您真的想坚持使用内置API,那么请使用Calendar.在最起码TimeUnit枚举,这将使:

long millisFor48Days = TimeUnit.DAYS.toMillis(48);
Run Code Online (Sandbox Code Playgroud)

你还需要考虑时区 - 虽然"今天"可能是你的12月18日,但它并不是世界其他地方.

  • @MartijnCourteaux:这根本不是真的.在基于.NET的问题中,我建议使用Noda Time! (2认同)