Java处理多格式营业时间字符串并分类存储的技术问询
处理多样化营业时间字符串的Java实现方案
核心思路
要处理格式混乱的营业时间数据,核心是标准化输入→解析规则→映射到每日,分四步走:
- 预处理:统一符号,消除格式差异
- 映射星期:建立缩写/全称到完整星期名的对应关系
- 解析规则:区分「连续星期段」「单个星期」「全天营业」三种情况
- 格式化输出:统一每日营业时间的展示格式
具体实现代码
import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class BusinessHoursParser { // 星期映射表:覆盖缩写、全称,统一为完整星期名 private static final Map<String, String> DAY_MAPPING = new HashMap<>(); static { DAY_MAPPING.put("mon", "Monday"); DAY_MAPPING.put("tue", "Tuesday"); DAY_MAPPING.put("wed", "Wednesday"); DAY_MAPPING.put("thu", "Thursday"); DAY_MAPPING.put("fri", "Friday"); DAY_MAPPING.put("sat", "Saturday"); DAY_MAPPING.put("sun", "Sunday"); DAY_MAPPING.put("monday", "Monday"); DAY_MAPPING.put("tuesday", "Tuesday"); DAY_MAPPING.put("wednesday", "Wednesday"); DAY_MAPPING.put("thursday", "Thursday"); DAY_MAPPING.put("friday", "Friday"); DAY_MAPPING.put("saturday", "Saturday"); DAY_MAPPING.put("sunday", "Sunday"); } // 星期顺序:用于处理连续时间段(比如Mon-Fri) private static final List<String> DAY_ORDER = Arrays.asList( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ); public static String[] parseHours(String input) { // 初始化结果数组,默认先设为Closed String[] dailyHours = new String[7]; Arrays.fill(dailyHours, "Closed"); // 预处理:统一符号,去掉多余空格,转小写方便匹配 String cleanedInput = input.toLowerCase() .replaceAll("–", "-") // 替换中文破折号为英文破折号 .replaceAll("\\s*-\\s*", "-") // 去掉破折号前后的空格 .replaceAll("\\s*,\\s*", ",") // 去掉逗号前后的空格 .replaceAll("\\s+", " ") // 多个空格合并为一个 .trim(); // 处理24/7特殊情况 if (cleanedInput.equals("24/7")) { Arrays.fill(dailyHours, "24/7"); return formatDailyHours(dailyHours); } // 拆分各个时间段条目(按逗号分割) String[] entries = cleanedInput.split(","); for (String entry : entries) { // 匹配连续星期段:比如 "monday-friday: 8am-5pm" 或 "monday 4am-8pm-saturday 4am-8pm" Pattern rangePattern = Pattern.compile("([a-z]+)-([a-z]+)[:\\s](.*)"); Matcher rangeMatcher = rangePattern.matcher(entry); if (rangeMatcher.find()) { String startDay = DAY_MAPPING.get(rangeMatcher.group(1)); String endDay = DAY_MAPPING.get(rangeMatcher.group(2)); String hours = rangeMatcher.group(3).trim(); // 找到连续星期的索引范围,给中间所有天赋值 int startIdx = DAY_ORDER.indexOf(startDay); int endIdx = DAY_ORDER.indexOf(endDay); if (startIdx != -1 && endIdx != -1) { for (int i = startIdx; i <= endIdx; i++) { dailyHours[i] = hours; } } continue; } // 匹配单个星期的营业时间:比如 "sat closed" 或 "tue 7:15 am-4:00 pm" Pattern singleDayPattern = Pattern.compile("([a-z]+)\\s+(.*)"); Matcher singleMatcher = singleDayPattern.matcher(entry); if (singleMatcher.find()) { String day = DAY_MAPPING.get(singleMatcher.group(1)); String hours = singleMatcher.group(2).trim(); int idx = DAY_ORDER.indexOf(day); if (idx != -1) { dailyHours[idx] = hours; } } } // 统一格式输出(比如把am转成AM,Closed小写转首字母大写等) return formatDailyHours(dailyHours); } // 格式化每日营业时间的展示样式 private static String[] formatDailyHours(String[] rawHours) { String[] formatted = new String[7]; for (int i = 0; i < 7; i++) { String day = DAY_ORDER.get(i); String hours = rawHours[i]; // 统一时间大小写,比如am→AM,pm→PM hours = hours.replace("am", "AM").replace("pm", "PM"); // Closed转首字母大写 if (hours.equals("closed")) { hours = "Closed"; } formatted[i] = day + ": " + hours; } return formatted; } // 测试示例 public static void main(String[] args) { String[] testCases = { "Monday – Friday: 8am – 5pm, Saturday Closed, Sunday Closed", "Mon 7:15 AM - 4:00 PM, Tue 7:15 AM - 4:00 PM, Wed 7:15 AM - 4:00 PM, Thu 7:15 AM - 4:00 PM, Fri Closed, Sat Closed, Sun Closed", "Monday 4AM-8PM-Saturday 4AM-8PM, Sunday Closed", "Mon Closed, Tue Closed, Wed 7 - 9:00 AM, Thu Closed, Fri Closed, Sat 7 - 9:00 AM, Sun Closed", "24/7" }; for (String test : testCases) { System.out.println("输入:" + test); String[] result = parseHours(test); System.out.println("输出:"); for (String line : result) { System.out.println(" " + line); } System.out.println("------------------------"); } } }
代码说明
- 预处理阶段:把各种不规则的符号(比如中文破折号、多余空格)统一成标准格式,避免匹配出错。
- 星期映射:把所有可能的星期缩写、全称映射到统一的完整星期名,方便后续索引。
- 规则解析:
- 先处理
24/7这种特殊值,直接给所有天赋值。 - 用正则匹配连续星期段(比如
Monday-Friday),找到星期的索引范围后批量赋值。 - 匹配单个星期的营业时间,单独给对应星期赋值。
- 先处理
- 格式化:统一时间的大小写,让输出样式保持一致。
扩展优化
- 如果有更多特殊格式(比如
Weekdays 9-5, Weekends Closed),可以新增正则规则匹配。 - 可以把结果存到
Map<String, String>或者单独的monHours、tuesHours等变量中,比如:String[] result = parseHours(input); String monHours = result[0].split(": ")[1]; String tuesHours = result[1].split(": ")[1]; // 以此类推
内容的提问来源于stack exchange,提问作者Shahnawaz Syed
相关产品推荐
相关产品推荐

