在Java/GWT中解析用户时间输入
解析用户在GWT文本字段中键入的时间的最佳方法是什么?默认时间格式要求用户输入的时间与locale的时间格式指定的时间完全相同在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
我希望更加灵活,因为用户可以通过许多不同的方式输入时间。例如,像“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很棒的建议。非常感谢。我将编辑答案以反映它们。