Java验证日期是否属于当前周失败问题排查
问题诊断与解决方案
首先,你的代码里有两个核心问题导致日期验证始终失败,我来逐一拆解并给出修复方案:
1. 日期解析格式完全不匹配
你的输入日期字符串是"05/30/2018",也就是**月/日/年(MM/dd/yyyy)**的格式,但你在convertStringToDate方法里用的是SimpleDateFormat("dd/MM/yyyy")(日/月/年)。这会直接导致解析出来的日期完全偏离预期!
举个实际例子:"05/30/2018"会被错误解析——dd/MM/yyyy会把05当成日,30当成月。由于SimpleDateFormat默认开启宽松模式(lenient),它不会直接抛出异常,而是自动把30月转换成2018年+2年(24个月)+6个月,最终得到2020年6月5日。你用这个错误的日期去判断是否在当前周,结果自然是false。
修复方法:把SimpleDateFormat的模式改成"MM/dd/yyyy",同时建议关闭宽松模式,避免非法日期被悄悄转换:
public Date convertStringToDate(String dateString) { SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); formatter.setLenient(false); // 关闭宽松模式,非法日期直接抛异常 Date dateInString = null; try { dateInString = formatter.parse(dateString); System.out.println(dateInString); System.out.println(formatter.format(dateInString)); } catch (ParseException e) { e.printStackTrace(); } return dateInString; }
2. Calendar的周计算依赖Locale和规则设置
即使日期解析正确,Calendar.WEEK_OF_YEAR的计算也可能因为地区差异或周起始日设置出现偏差:
- 不同地区的周起始日不同:比如美国默认周日是一周第一天,欧洲多数国家默认周一
- 跨年周的计算规则也有差异(比如ISO标准要求第一周至少包含4天)
修复方法(基于Calendar):统一设置Locale和周规则,比如使用ISO标准:
public boolean isDateInCurrentWeek(Date date) { // 统一使用ISO周规则:周一为起始日,第一周至少包含4天 Calendar currentCalendar = Calendar.getInstance(Locale.US); currentCalendar.setFirstDayOfWeek(Calendar.MONDAY); currentCalendar.setMinimalDaysInFirstWeek(4); int week = currentCalendar.get(Calendar.WEEK_OF_YEAR); int year = currentCalendar.get(Calendar.YEAR); Calendar targetCalendar = Calendar.getInstance(Locale.US); targetCalendar.setFirstDayOfWeek(Calendar.MONDAY); targetCalendar.setMinimalDaysInFirstWeek(4); targetCalendar.setTime(date); int targetWeek = targetCalendar.get(Calendar.WEEK_OF_YEAR); int targetYear = targetCalendar.get(Calendar.YEAR); return (week == targetWeek && year == targetYear); }
更推荐:使用Java 8+的新时间API(LocalDate)
Calendar和SimpleDateFormat是过时的API,线程不安全且容易踩坑。Java 8引入的java.time包更可靠、更直观,推荐替换成这套方案:
日期解析
public LocalDate convertStringToLocalDate(String dateString) { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy"); return LocalDate.parse(dateString, formatter); } catch (DateTimeParseException e) { e.printStackTrace(); return null; } }
判断是否在当前周
public boolean isDateInCurrentWeek(LocalDate date) { // 使用ISO周规则,也可以自定义周起始日 WeekFields weekFields = WeekFields.ISO; LocalDate currentDate = LocalDate.now(); int currentWeek = currentDate.get(weekFields.weekOfYear()); int currentYear = currentDate.get(weekFields.weekBasedYear()); int targetWeek = date.get(weekFields.weekOfYear()); int targetYear = date.get(weekFields.weekBasedYear()); return currentWeek == targetWeek && currentYear == targetYear; }
调用方式
LocalDate targetDate = convertStringToLocalDate(trans.getTransactionDate()); if(targetDate != null && isDateInCurrentWeek(targetDate)){ // perform some task }
内容的提问来源于stack exchange,提问作者Erent
相关产品推荐
相关产品推荐

