java文本日期处理工具类

日期处理工具

package com.mybatis.plus.utils;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TimeWords {
    private static String regex_date;
    private static String regex_time;
    private static final String L = "(";
    private static final String R = ")";
    private static final String O = "|";

    static {
        createRegexDate();
        createRegexTime();
    }

    /***
     *  截取字符串里的日期
     * @param input
     * @return
     */
    private static String[] get(String regex, String input) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        String s[] = new String[10000];
        int len = 0;
        while (matcher.find()) {
            s[len] = matcher.group();
            len++;
        }
        return Arrays.copyOf(s, len);
    }


    private static void createRegexTime() {
        String nh = "((1[0-9])|(2[0-4])|((0|)[0-9]))";
        String duan = "(上午|下午|晚上|凌晨|早上|夜晚|am|pm|)";
        String ch = "(((二|)(十|)[零,一,二,三,四,五,六,七,八,九,十]))";
        String ce = "(点|:)";
        String cme = "(分|)";
        String t1 = "((一刻)|(半)|([0-5][0-9]))" + cme;
        String t2 = duan + orRegex(nh, ch) + ce + orRegex(t1, "");
        regex_time = t2;
    }


    private static void createRegexDate() {
        final String C09 = "([0,1,2,3,4,5,6,7,8,9,十,〇,一,二,三,四,五,六,七,八,九])";
        final String C19 = "([1,2,3,4,5,6,7,8,9,一,二,三,四,五,六,七,八,九])";
        final String C0 = "[0,十]";
        final String C1 = "[1,一]";
        final String C01 = "[0,十,1,一]";
        final String C02 = "[0,1,2,十,一,二]";
        final String C3 = "[3,三]";
        final String C12 = "[1,2,一,二]";
        final String C17 = "[1,2,3,4,5,6,7,一,二,三,四,五,六,日]";
        final String Y = C02 + C09 + C09 + C09;
        final String M = orRegex(C09, C1 + C02, orRegex(C0, "") + C19);
        final String D = orRegex(C09, C12 + C09, C3 + C01, orRegex(C0, "") + C19, C19 + orRegex(C0, "") + C19);
        final String W = "((周|下周|本周)(" + C17 + "|末))|((下周星期|下礼拜|礼拜|下星期|星期)(" + C17 + "|天))";
        final String M_END1 = "";
        final String D_END1 = "(日|号)";
        final String Y_END1 = "";
        final String E = "(-|\\.)";
        String year = orRegex(Y + Y_END1, "");
        String year_month = year + M + M_END1;
        String day = D + D_END1;
        String day_week = orRegex(day, "") + W;
        String month_day = orRegex(orRegex(M + M_END1, "") + day, M + M_END1 + D);
        String year_month_day = year_month + day;
        regex_date = orRegex(year_month_day, month_day, day_week, year_month);
        regex_date = orRegex(regex_date, Y + E + M + E + D, Y + E + M, M + E + D);
    }


    public static Map<String, String> words(String input) {
        String value = "t 1024";
        Map<String, String> map = new HashMap<>();
        put(map, get(regex_date, input), value);
        put(map, get(regex_time, input), value);
        return map;
    }

    private static void put(Map<String, String> map, String keys[], String value) {
        for (int i = 0; i < keys.length; i++) {
            map.put(keys[i], value);
        }
    }

    private static String orRegex(String... args) {
        String regex = "";
        for (int i = 0; i < args.length; i++) {
            regex = regex + O + L + args[i] + R;
        }
        return L + regex.substring(1) + R;
    }


    public static void main(String[] args) throws IOException {
        testConvertZwrq();
    }

    private static void testConvertZwrq() {
        String[] list = new String[]{"二〇一九年十一月","二○○九年四月三十日", "○九年四月三十日", "二○○九年十二月三十一日", "二零零九年十二月三十一日"};
        for (String s : list) {
            Date d = convertCnDate(s);
            System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(d));
        }
    }

    public static Date convertCnDate(String cprq) {
        int yearPos = cprq.indexOf("");
        int monthPos = cprq.indexOf("");
        String cnYear = cprq.substring(0, yearPos);
        String cnMonth = cprq.substring(yearPos + 1, monthPos);

        String cnDay = null;
        try {
            cnDay = cprq.substring(monthPos + 1, cprq.length() - 1);
        } catch (Exception e) {
            cnDay = "";
        }

        String year = ConvertCnYear(cnYear);
        String month = ConvertCnDateNumber(cnMonth);

        String day = ConvertCnDateNumber(cnDay);
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, Integer.parseInt(year));
        c.set(Calendar.MONTH, Integer.parseInt(month) - 1);
        c.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
        return c.getTime();
    }

    private static String ConvertCnYear(String cnYear) {
        if (cnYear.length() == 2)
            return "20" + ConvertCnNumberChar(cnYear);
        else
            return ConvertCnNumberChar(cnYear);
    }

    private static String ConvertCnDateNumber(String cnNumber) {
        if (cnNumber.length() == 1) {
            if (cnNumber.equals(""))
                return "10";
            else
                return ConvertCnNumberChar(cnNumber);
        } else if (cnNumber.length() == 2) {
            if (cnNumber.startsWith("")) {
                return "1" + ConvertCnNumberChar(cnNumber.substring(1, 2));
            } else if (cnNumber.endsWith("")) {
                return ConvertCnNumberChar(cnNumber.substring(0, 1)) + "0";
            } else {
                return ConvertCnNumberChar(cnNumber);
            }
        } else if (cnNumber.length() == 3) {
            return ConvertCnNumberChar(cnNumber.substring(0, 1) + cnNumber.substring(2, 3));
        }
        return null;
    }

    private static String ConvertCnNumberChar(String cnNumberStr) {
        String ALL_CN_NUMBER = "〇○零一二三四五六七八九";
        String ALL_NUMBER = "000123456789";
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < cnNumberStr.length(); i++) {
            char c = cnNumberStr.charAt(i);
            int index = ALL_CN_NUMBER.indexOf(c);
            if (index != -1) {
                buf.append(ALL_NUMBER.charAt(index));
            } else {
                buf.append(cnNumberStr.charAt(i));
            }
        }
        return buf.toString();
    }

}

 

posted @ 2020-04-27 15:34  官萧何  阅读(246)  评论(0编辑  收藏  举报