You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("------------------------");
        }
    }
}

代码说明

  1. 预处理阶段:把各种不规则的符号(比如中文破折号、多余空格)统一成标准格式,避免匹配出错。
  2. 星期映射:把所有可能的星期缩写、全称映射到统一的完整星期名,方便后续索引。
  3. 规则解析:
    • 先处理24/7这种特殊值,直接给所有天赋值。
    • 用正则匹配连续星期段(比如Monday-Friday),找到星期的索引范围后批量赋值。
    • 匹配单个星期的营业时间,单独给对应星期赋值。
  4. 格式化:统一时间的大小写,让输出样式保持一致。

扩展优化

  • 如果有更多特殊格式(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:17:42