Java如何解析带th序数后缀的日期字符串并校验近5分钟时间
带英文序数后缀的日期解析方案
SimpleDateFormat 没有内置支持解析st/nd/rd/th这类英文日期序数后缀,用下面两种方式都可以实现解析,不需要额外引入第三方依赖:
方案1:字符串预处理(最简单,兼容所有Java版本)
解析前先用正则把数字后面的序数后缀移除,再走正常的日期解析逻辑即可,正则可以覆盖所有序数规则(包括1st、2nd、3rd、11th、21st这类特殊后缀):
String rawDateStr = "Jun 8th 2022 16:31:22"; // 正则匹配数字后紧跟的序数后缀,替换为空 String cleanDateStr = rawDateStr.replaceAll("(?<=\\d)(st|nd|rd|th)", ""); // 注意你原来的格式定义有错误,修正后如下: // DD 是年积日,月份日期用 d;YYYY 是周纪年,公历年用 yyyy;hh 是12小时制,24小时制用 HH // 解析英文月份必须指定英文Locale,否则非英文环境会解析失败 SimpleDateFormat sdf = new SimpleDateFormat("MMM d yyyy HH:mm:ss", Locale.ENGLISH); Date parsedDate = sdf.parse(cleanDateStr); // 后续和当前时间比对差值即可 long diffInMillis = Math.abs(System.currentTimeMillis() - parsedDate.getTime()); boolean isInLast5Minutes = diffInMillis <= 5 * 60 * 1000;
方案2:使用Java 8+ 官方java.time API(推荐)
Java 8 开始内置的java.time包是目前官方推荐的日期时间处理API,线程安全、时间差计算逻辑更清晰,同样搭配预处理正则即可使用:
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Locale; public class DateCheckDemo { public static void main(String[] args) { String rawDateStr = "Jun 8th 2022 16:31:22"; String cleanDateStr = rawDateStr.replaceAll("(?<=\\d)(st|nd|rd|th)", ""); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy HH:mm:ss", Locale.ENGLISH); LocalDateTime parsedTime = LocalDateTime.parse(cleanDateStr, formatter); LocalDateTime currentTime = LocalDateTime.now(ZoneId.systemDefault()); // 直接计算分钟差,判断是否在5分钟范围内 long minuteDiff = Math.abs(ChronoUnit.MINUTES.between(parsedTime, currentTime)); boolean isInLast5Minutes = minuteDiff <= 5; } }
不推荐为了这个场景引入第三方日期库,也不推荐给DateTimeFormatter写复杂的自定义字段解析逻辑,正则预处理的方式代码量最少、可维护性最高,完全覆盖所有合法的英文日期序数场景。
内容的提问来源于stack exchange,提问作者Prophet
相关产品推荐
相关产品推荐

