格式: [上下 午][XX]时[XX]分[XX]秒 转换成 XX:XX:XX import java.util.regex.Matcher;import java.util.regex.Pattern;public class TimeConvertUtil {/** * 用于分割时间 */private static final String DIV_STR = ":";/** * 错误返回
import java.util.regex.Matcher; import java.util.regex.Pattern; public class TimeConvertUtil { /** * 用于分割时间 */ private static final String DIV_STR = ":"; /** * 错误返回 */ private static final String ERROR_RETURN = ""; /** * 用于分割时间 */ private static final String[] PREFIX = {"上","下","午"}; /** * 12时制 */ public static final String FORMATTER_12H = "12H"; /** * 24时制 */ public static final String FORMATTER_24H = "24H"; /** * 零 */ public static final String ZERO = "0"; /** * 十 */ public static final String TEN = "十"; /** * 前缀,分割,数字 */ private static final char[] ALL_CN_CHAR = { '上','下','午', '时','点','分','秒','半','刻','整', '〇','零','一','二','三','四','五','六','七','八','九','十','两'}; private static final String[] ALL_CN_NUM = { "0","12",":", ":",":",":","","30:00","15","00:00", "0","0","1","2","3","4","5","6","7","8","9","十", "2"}; /** * * @param time 格式: [上/下 午][XX]时[XX]分[XX]秒 * @return 12时制 时间 */ public static String timeConvert(String time) { return timeConvert(time, FORMATTER_12H); } /** * * @param time 格式: [上/下 午][XX]时[XX]分[XX]秒 * @param formatter 12时制/24时制 * @return 12时制/24时制 时间 */ public static String timeConvert(String time, String formatter) { if(!(formatter.equals(FORMATTER_12H) || formatter.equals(FORMATTER_24H))) { System.err.println("parameter formatter is unexpected. [" + formatter + "]" + time); return ERROR_RETURN; } // 十,分,秒 对应的数字 int[] numTime = {0,0,0}; char[] timeArr = time.toCharArray(); try { CheckedInputStr(timeArr); } catch (Exception e) { System.err.println(e.getMessage() + " " + time); return ERROR_RETURN; } // 是否有前缀 boolean prefix = hasPerfix(time); StringBuffer buf = new StringBuffer(); for (char tc:timeArr) { for(int i = 0; i < ALL_CN_CHAR.length; i++) { if(tc == ALL_CN_CHAR[i]) { buf.append(ALL_CN_NUM[i]); } } } String[] num_Time_Arr = buf.toString().split(DIV_STR); // 对十进行处理 for(int i = 0; i < num_Time_Arr.length;i++) { if(num_Time_Arr[i].equals("")) { num_Time_Arr[i] = "0"; continue; } num_Time_Arr[i] = handleTen(num_Time_Arr[i]); } // 前缀需要加的时间 int perNum = 0; int idx = 0; if(prefix) { perNum = Integer.parseInt(num_Time_Arr[idx++]); } for(int i = idx; i < num_Time_Arr.length && i < (numTime.length + idx); i++) { numTime[i - idx] = Integer.parseInt(num_Time_Arr[i]); } numTime[0] += perNum; if(formatter.equals(FORMATTER_24H)) { numTime[0] = numTime[0] % 100 % 24; } else if(formatter.equals(FORMATTER_12H)) { numTime[0] = numTime[0] % 100 % 12; } numTime[1] = numTime[1] % 100 % 60; numTime[2] = numTime[2] % 100 % 60; StringBuffer final_buf = new StringBuffer(); final_buf.append(numTime[0] < 10? ZERO + numTime[0]: numTime[0]); final_buf.append(DIV_STR); final_buf.append(numTime[1] < 10? ZERO + numTime[1]: numTime[1]); final_buf.append(DIV_STR); final_buf.append(numTime[2] < 10? ZERO + numTime[2]: numTime[2]); return final_buf.toString(); } /** * 分情况给"十"赋值 * @param string * @return */ private static String handleTen(String numS) { int idx = numS.indexOf(TEN); if(idx >= 0) { int len = numS.length(); // 替换中文 String reg = "[\u4e00-\u9fa5]"; Pattern pat = Pattern.compile(reg); Matcher mat=pat.matcher(numS); if(len == 1) { // 只有一个十 numS = mat.replaceAll("10"); } else if(idx == 0) { // 在开头 numS = mat.replaceAll("1"); } else if (idx == numS.length() - 1) { // 在结尾 numS = mat.replaceAll("0"); } else { numS = mat.replaceAll(""); } } return numS; } /** * 是否有前缀 "上","下","午" * @param time * @return */ private static boolean hasPerfix(String time) { for(String per:PREFIX) { if(time.indexOf(per) >= 0) return true; } return false; } /** * 检测输入有无期望以外的值 * @param time * @throws Exception */ private static void CheckedInputStr(char[] time) throws Exception { if(time.length <= 0) throw new Exception("length of time string unexpected " + time.length + "."); boolean in_Arr = false; char ch_temp = ' '; for(char s:time) { ch_temp = s; in_Arr = false; for(char cns:ALL_CN_CHAR) { if(s==cns) { in_Arr = true; break; } } if(!in_Arr) throw new Exception("unexpected character [" + ch_temp + "] in time string. [" + ch_temp + "] "); } } public static void main(String[] args) { // 正例 System.out.println(timeConvert("二十三时十五分十五秒")); System.out.println(timeConvert("十三点一刻")); System.out.println(timeConvert("上午十点零五分五秒")); System.out.println(timeConvert("下午三时五十分五十秒")); System.out.println(timeConvert("十三时整")); System.out.println(timeConvert("十三时半")); System.out.println(timeConvert("十时十分十秒")); System.out.println(timeConvert("二十六时十分十秒")); System.out.println(timeConvert("二十四时十分十秒")); System.out.println(timeConvert("二十三时十五分十五秒", FORMATTER_24H)); System.out.println(timeConvert("十三点一刻", FORMATTER_24H)); System.out.println(timeConvert("上午十点零五分五秒", FORMATTER_24H)); System.out.println(timeConvert("下午三时五十分五十秒", FORMATTER_24H)); System.out.println(timeConvert("十三时整", FORMATTER_24H)); System.out.println(timeConvert("十三时半", FORMATTER_24H)); System.out.println(timeConvert("十时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("下午十时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("二十六时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("二十四时十分十秒", FORMATTER_24H)); // 反例 System.out.println(timeConvert("下午十午时十下分十整秒")); System.out.println(timeConvert("下午三十十时十分十秒1")); System.out.println(timeConvert("上午三十十时十分十秒")); System.out.println(timeConvert("下午十三十时十分十秒")); System.out.println(timeConvert("下午十三十时十分十秒")); System.out.println(timeConvert("下午十时十分十秒", "12")); System.out.println(timeConvert("下午十整时十分十秒")); System.out.println(timeConvert("下午十时整十分十秒")); System.out.println(timeConvert("下午十时整十分整十秒")); System.out.println(timeConvert("下午十时十分十秒整")); System.out.println(timeConvert("下午十半时十分十秒")); System.out.println(timeConvert("下午十时半十分十秒")); System.out.println(timeConvert("下午十时十分半十秒")); System.out.println(timeConvert("下午十时十分十秒半")); System.out.println(timeConvert("下午十午时十下分十整秒", FORMATTER_24H)); System.out.println(timeConvert("下午三十十时十分十秒1", FORMATTER_24H)); System.out.println(timeConvert("上午三十十时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("下午十三十时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("下午三十时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("下午十时十分十秒", "12")); System.out.println(timeConvert("下午十时十分十秒", FORMATTER_24H)); System.out.println(timeConvert("下午十时十分十秒", FORMATTER_24H)); } }