Java非8环境下java.util.Date减毫秒异常及减月实现求助
解决Java 7及以下版本中Date减数月与整数溢出问题
先搞定你之前减天数的意外结果问题
你之前的代码numDaysToSubtract * 24 * 3600 * 1000会触发整数溢出!因为int类型的最大值是2147483647,而60天的毫秒数是60*24*3600*1000=5184000000,远超过这个值,计算时会变成负数或者错误的正数,导致newDate完全不对。
修正方法很简单,把其中一个操作数转成long类型,让整个计算在long范围内进行:
int numDaysToSubtract = 60; Date curDate = new Date(); // 把第一个数改成long类型,避免溢出 Date newDate = new Date(curDate.getTime() - ((long)numDaysToSubtract * 24 * 3600 * 1000));
重点:Java 8之前给Date减数月的正确姿势
因为Java 8之前没有LocalDate这种方便的日期类,我们得用java.util.Calendar来处理月份的加减——它会自动处理不同月份的天数差异(比如31号减1个月到2月会自动调整到月末),比自己算靠谱多了。
示例代码(比如要减2个月):
int numMonthsToSubtract = 2; Date curDate = new Date(); // 1. 创建Calendar实例,设置当前日期 Calendar calendar = Calendar.getInstance(); calendar.setTime(curDate); // 2. 减去指定月份,传入负数表示减去 calendar.add(Calendar.MONTH, -numMonthsToSubtract); // 3. 把Calendar转回Date对象 Date newDate = calendar.getTime();
额外提醒
- Calendar的月份是从0开始的(0=1月,11=12月),不过用
add(Calendar.MONTH, ...)的时候不用管这个,直接传正负数值就行,它会自动处理。 - 如果你的日期是比如3月31号,减1个月会变成2月的最后一天(28或29号,取决于闰年),这是符合实际日期逻辑的,比自己硬算天数要准确得多。
内容的提问来源于stack exchange,提问作者3802400
相关产品推荐
相关产品推荐

