时间转换工具类

package bly;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 中文大写日期转小写
 */
public class TestTime {

    public static void main(String[] args) {
        System.out.println(cnNumericToArabic("二零一七年十月十二日"));
        System.out.println(cnNumericToArabic("二零一七年十一月二十日"));
        System.out.println(cnNumericToArabic("二零一七年一月二十三日"));
    }

    private static final Character[] CN_NUMERIC = { '一', '二', '三', '四', '五',
            '六', '七', '八', '九', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖',
            '○', 'O', '零', '十', '拾', 'O', '0' };

    // 日期正则 eg:二零一七年五月十三日
    private static final String DATE_REGEX = "(?<YEAR>[0O○〇一二三四五六七八九十零壹贰叁肆伍陆柒捌玖拾]{1,4})[年\\\\.-](?:(?<MONTH>[0O○〇一二三四五六七八九十零壹贰叁肆伍陆柒捌玖拾]{1,2})[月\\\\.-])?(?:(?<DAY>[0O○〇一二三四五六七八九十零壹贰叁肆伍陆柒捌玖拾]{1,3})[日号\\\\.-])?";

    private static Map<Character, String> cnNumeric = null;

    private static final String num_shi = "10";

    static {
        cnNumeric = new HashMap<Character, String>();
        for (int j = 0; j < 9; j++)
            cnNumeric.put(CN_NUMERIC[j], String.valueOf(j + 1));
        for (int j = 9; j < 18; j++)
            cnNumeric.put(CN_NUMERIC[j], String.valueOf(j - 9));
        cnNumeric.put('0', "0");
        cnNumeric.put('O', "0");
        cnNumeric.put('○', "0");
        cnNumeric.put('O', "0");
        cnNumeric.put('〇', "0");
        cnNumeric.put('零', "0");
        cnNumeric.put('十', "1");
        cnNumeric.put('拾', "1");
    }

    public static Date cnNumericToArabic(String dateStr) {
        Date date = new Date();
        date = null;
        dateStr = dateStr.trim();
        Matcher matcher = Pattern.compile(DATE_REGEX).matcher(dateStr);
        if (matcher.find()) {
            String year = matcher.group("YEAR");
            String month = matcher.group("MONTH");
            String day = matcher.group("DAY");
            if (year != null && month != null && day != null) {
                date = getTransToDate(year, month, day);
            }
        }
        return date;
    }

    /**
     * 转换年月日为小写数字Date类型
     * 
     * @param year
     * @param month
     * @param day
     * @return
     */
    private static Date getTransToDate(String year, String month, String day) {
        Date date = new Date();
        String yearNumber = getNumber(year);
        String monthNumber = getNumber(month);
        String dayNumber = getNumber(day);
        if (yearNumber != null && monthNumber != null && dayNumber != null) {
            String dateStr = yearNumber.concat("-").concat(monthNumber)
                    .concat("-").concat(dayNumber);
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            try {
                date = format.parse(dateStr);
            } catch (ParseException e) {
            } finally {

            }
        }

        return date;
    }

    /**
     * 将大写转为小写阿拉伯数据string
     * 
     * @param str
     * @return
     */
    private static String getNumber(String str) {
        String number = "";
        str = str.replace(" ", "").replace("拾", "十");
        int strLength = str.length();
        String lastStr = str.substring(strLength - 1);
        // 若str为十或拾 则直接返回10
        if (strLength == 1 && ("十".equals(str))) {
            return num_shi;
        }
        // 若str为几十例如贰拾或二十则将十或拾替换为零
        else if (strLength == 2 && ("十".equals(lastStr))) {
            str = str.replace("十", "零");
        } else if (strLength == 3) {
            str = removeTen(str);
        }

        // 将大写转为小写阿拉伯数据
        strLength = str.length();
        for (int i = 0; i < strLength; i++) {
            char s = str.charAt(i);
            String temp = cnNumeric.get(str.charAt(i));
            number = number.concat(temp);
        }
        return number;
    }

    /**
     * 判断移除十的类型
     * 
     * @param numArrayTwo
     * @return
     */
    private static String removeTen(String str) {
        char[] numArray = str.toCharArray();
        String numArrayTwo = String.valueOf(numArray[1]);

        if ("十".equals(numArrayTwo)) {
            numArray = remove(numArray, '十');
            str = String.valueOf(numArray);
        }
        return str;
    }

    /**
     * 若十或拾在中间,将其移除
     * 
     * @param arr
     * @param num
     * @return
     */
    private static char[] remove(char[] arr, char num) {

        char[] tmp = new char[arr.length - 1];

        int idx = 0;
        boolean hasRemove = false;
        for (int i = 0; i < arr.length; i++) {

            if (!hasRemove && arr[i] == num) {
                hasRemove = true;
                continue;
            }

            tmp[idx++] = arr[i];
        }

        return tmp;
    }
}

猜你喜欢

转载自blog.csdn.net/bii_yu/article/details/80880752