在Java/GWT中解析用户时间输入

在Java/GWT中解析用户时间输入,java,regex,gwt,internationalization,Java,Regex,Gwt,Internationalization,解析用户在GWT文本字段中键入的时间的最佳方法是什么?默认时间格式要求用户输入的时间与locale的时间格式指定的时间完全相同 我希望更加灵活,因为用户可以通过许多不同的方式输入时间。例如,像“8”、“8p”、“8pm”、“8.15pm”、“13:15”、“1315”、“13.15”这样的条目应该是有效的。我以自己想要分享的方法结束。此方法以毫秒为单位返回时间,可以使用所选区域设置的任何数据格式显示时间 如有任何改进建议,我们将不胜感激 编辑:改进评论中的以下建议 public static L

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


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

我以自己想要分享的方法结束。此方法以毫秒为单位返回时间,可以使用所选区域设置的任何数据格式显示时间

如有任何改进建议,我们将不胜感激

编辑:改进评论中的以下建议

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;
}
公共静态长解析时间(字符串值){
//“;”是一种常见的打字错误-我们不会因此惩罚用户
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])?)$”;
如果(时间12.测试(值)|时间24.测试(值)){
字符串hours=“0”,minutes=“0”;
if(value.contains(“:”)| | value.contains(“.”){
字符串[]值=value.split(“[:.]”);
小时=数值[0];
分钟=值[1]。子字符串(0,2);
}否则{
//处理字符串,如“8”、“8p”、“8pm”、“2300”
如果(值包含(“a”)){
小时数=value.substring(0,value.indexOf(“a”)).trim();
}else if(值包含(“p”)){
小时数=value.substring(0,value.indexOf(“p”)).trim();
}else if(value.length()<3){
小时=价值;
}否则{
小时=value.substring(0,value.length()-2);
分钟=value.substring(value.length()-2);
}
}
如果(值包含(“a”)和小时数等于(“12”)){
//上午12点实际上是零小时
小时数=“0”;
}
长时间=(长时间值(小时)*60+长时间值(分钟))*60*1000;
如果(值包含(“p”)&&!小时数等于(“12”)){
//“下午”加上12小时,除了下午12点
时间+=12*60*60*1000;
}
返回时间;
}
返回null;
}

您可能希望将
[:.;]?([0-5][0-9])?
替换为
([:.;]?[0-5][0-9])?
,或者如果您希望允许像
“8:
这样的输入,您应该处理一个可能的
ArrayIndexOutOfBoundsException
。您目前还允许输入“14AM”。我想你可以用一个
来划分正则表达式,或者在
(a | p | am | pm)
后面添加一个look,以避免出现这种情况。@Lone nebula很棒的建议。非常感谢。我将编辑答案以反映它们。