Java中如何裁剪字符串以便使用SimpleDateFormat解析时间?
实现方案
核心思路是先用正则匹配所有符合「1~2位数字+冒号+2位数字」格式的候选子串,再通过SimpleDateFormat严格校验筛选出合法的时间片段,避免匹配到25:61这类格式正确但逻辑不合法的内容。
完整可运行代码
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TimeExtractor { public static void main(String[] args) throws ParseException { String wholeString = new String("The time is 7:00."); // 裁剪字符串的核心逻辑 Pattern timePattern = Pattern.compile("\\d{1,2}:\\d{2}"); Matcher matcher = timePattern.matcher(wholeString); String timeOnlyString = ""; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); // 开启严格解析,避免25:00这类非法时间被误判 sdf.setLenient(false); while (matcher.find()) { String candidate = matcher.group(); try { // 校验是否为合法时间 sdf.parse(candidate); timeOnlyString = candidate; break; } catch (ParseException ignored) { // 非法候选直接跳过 } } // 后续原有逻辑 Date timeAsObject = sdf.parse(timeOnlyString); String timeAsString = sdf.format(timeAsObject); System.out.println(timeAsString); } }
说明
- 正则
\d{1,2}:\d{2}会优先匹配所有形如7:00、07:00、23:59的候选串 - 调用
sdf.setLenient(false)关闭宽松解析,确保只有00:00~23:59范围内的时间会被提取 - 提取到的1位小时时间(如7:00)在经过
HH:mm格式格式化后,会自动补前导零输出为07:00,符合预期结果 - 如果需要提取字符串中所有符合要求的时间片段,可将匹配到的合法candidate存入列表即可,当前逻辑默认取第一个匹配的合法时间
内容的提问来源于stack exchange,提问作者CaptianBarouq
相关产品推荐
相关产品推荐

