【问题标题】:Parsing user time input in Java/GWT在 Java/GWT 中解析用户时间输入
【发布时间】:2013-05-22 04:03:57
【问题描述】:

在 GWT 中解析用户在文本字段中键入的时间的最佳方法是什么?默认时间格式要求用户输入与语言环境指定的时间格式完全相同的时间。

我希望更加灵活,因为用户可以通过多种不同的方式输入时间。例如,“8”、“8p”、“8pm”、“8.15pm”、“13:15”、“1315”、“13.15”等条目应该是有效的。

【问题讨论】:

    标签: java regex gwt internationalization


    【解决方案1】:

    最后我想分享我自己的方法。此方法以毫秒为单位返回时间,可以使用所选语言环境的任何数据格式显示。

    非常感谢任何改进它的建议。

    编辑:改进了 cmets 中的以下建议。

    public static Long parseTime(String value) {
    
        // ";" is a common typo - we are not punishing users for it
        value = value.trim().toLowerCase().replace(";", ":");
    
        RegExp time12 = RegExp.compile("^(1[012]|[1-9])([:.][0-5][0-9])?(\\s)?(a|p|am|pm)?$");
        RegExp time24 = RegExp.compile("^(([01]?[0-9]|2[0-3])[:.]?([0-5][0-9])?)$");
    
        if (time12.test(value) || time24.test(value)) {
    
            String hours = "0", minutes = "0";
    
            if (value.contains(":") || value.contains(".")) {
                String[] values = value.split("[:.]");
                hours =  values[0];
                minutes = values[1].substring(0, 2);
            } else {
                // Process strings like "8", "8p", "8pm", "2300"
                if (value.contains("a")) {
                    hours = value.substring(0, value.indexOf("a")).trim();
                } else if (value.contains("p")) {
                    hours = value.substring(0, value.indexOf("p")).trim();
                } else if (value.length() < 3) {
                    hours = value;
                } else {
                    hours =  value.substring(0, value.length() - 2);
                    minutes = value.substring(value.length() - 2);
                }
            }
            if (value.contains("a") && hours.equals("12")) {
                // 12am is actually zero hours
                hours = "0";
            }
    
            Long time = (Long.valueOf(hours) * 60 + Long.valueOf(minutes)) * 60 * 1000;
    
            if (value.contains("p") && !hours.equals("12")) {
                // "pm" adds 12 hours to the total, except for 12pm
                time += 12 * 60 * 60 * 1000;
            }
    
            return time;
        }
        return null;
    }
    

    【讨论】:

    • 你可能想用([:.;]?[0-5][0-9])?替换[:.;]?([0-5][0-9])?,或者如果你想允许"8:"这样的输入,你应该处理一个可能的ArrayIndexOutOfBoundsException。您目前还允许输入“14 am”之类的输入。我想您可以将正则表达式与| 分开,或者在(a|p|am|pm) 中添加一个look-behind 来避免这种情况。
    • @Lone nebula 很好的建议。谢谢!我将编辑答案以反映它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2010-11-29
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多