Java中使用Date类before()方法判断日期等于今日时结果异常问题
解决Date类before()方法判断日期相等时的错误问题
我来帮你捋清楚这个问题的根源和解决办法~
你遇到的错误输出,本质是因为Date类并非单纯的“日期”对象——它包含了完整的时间戳(精确到毫秒),而before()方法会直接比较两个Date的时间戳大小,哪怕它们的年月日完全相同,只要时分秒有差异,结果就会和你预期的不一样。
举个例子,我补全你截断的代码后,问题会更清晰:
public class JavaApplication28 { public static void main(String[] args) throws ParseException { Date date1; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String statusDT = "2018-04-08"; date1 = formatter.parse(statusDT); Date today = new Date(); // 假设当前时间是2018-04-08 10:30:00 System.out.println(date1.before(today)); // 输出true,但你预期是false(因为日期相等) } }
这里date1被解析成2018-04-08 00:00:00(时分秒默认补0),而today是当前时间(比如10:30:00),时间戳上date1确实小于today,所以before()返回true,但这并不是你想要的“日期是否早于今天”的判断结果。
解决方案
这里推荐两种靠谱的处理方式:
1. 用Calendar类提取年月日单独比较(兼容旧Java版本)
通过Calendar把两个Date的年、月、日提取出来,只比较日期部分:
public class JavaApplication28 { public static void main(String[] args) throws ParseException { Date date1; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String statusDT = "2018-04-08"; date1 = formatter.parse(statusDT); Date today = new Date(); Calendar calTarget = Calendar.getInstance(); calTarget.setTime(date1); Calendar calToday = Calendar.getInstance(); calToday.setTime(today); // 只比较年月日 boolean isDateBefore = calTarget.get(Calendar.YEAR) < calToday.get(Calendar.YEAR) || (calTarget.get(Calendar.YEAR) == calToday.get(Calendar.YEAR) && calTarget.get(Calendar.MONTH) < calToday.get(Calendar.MONTH)) || (calTarget.get(Calendar.YEAR) == calToday.get(Calendar.YEAR) && calTarget.get(Calendar.MONTH) == calToday.get(Calendar.MONTH) && calTarget.get(Calendar.DAY_OF_MONTH) < calToday.get(Calendar.DAY_OF_MONTH)); System.out.println(isDateBefore); // 今天是2018-04-08的话,输出false } }
2. 使用Java 8+的LocalDate类(推荐,更简洁)
Java 8引入的java.time包专门解决了旧日期API的痛点,LocalDate类就是单纯表示“日期”的对象,没有时间部分:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class JavaApplication28 { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String statusDT = "2018-04-08"; LocalDate targetDate = LocalDate.parse(statusDT, formatter); LocalDate today = LocalDate.now(); boolean isDateBefore = targetDate.isBefore(today); System.out.println(isDateBefore); // 今天是2018-04-08的话,输出false // 如果要判断是否等于今天,直接用equals即可 boolean isToday = targetDate.equals(today); System.out.println(isToday); // 输出true } }
这个方法不仅代码更简洁,还能避免旧API的线程安全问题、可变对象等坑,是现在官方推荐的日期处理方式。
内容的提问来源于stack exchange,提问作者John Joe
相关产品推荐
相关产品推荐

