首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据分类分级 数据识别-识别日期类型数据

数据分类分级 数据识别-识别日期类型数据

作者头像
鲲志说
发布2025-04-07 21:23:30
发布2025-04-07 21:23:30
3270
举报

前言

要做数据分类分级,重要的是分类分级模版的合理性和数据识别的准确性。数据识别主要技术涉及正则表达式、关键字典、机器学习、NLP、文档指纹等。对于结构化数据,具有一定规则的数据通常是正则表达式或算法来解决。本篇博客针对日期类型数据的识别展开讲解。

需求

利用正则表达式识别如下日期类型数据,验证是否为合法的日期字符串,并转化为数据库的datetime类型(yyyy-MM-dd HH:mm:ss)

日期格式

本次数据识别针对的日期格式如下

  1. // 2001年02月10日 yyyy年M月d日
  2. // 二〇一一年三月七日 yyyy年M月d日
  3. // 2001/2/20 yyyy/M/d
  4. // 2001-2-20 yyyy-MM-dd
  5. // 20010220 yyyyMMdd
  6. // 20010220000000 yyyyMMddHHmmss
  7. // 2001/02/07 00:00:00 yyyy/MM/dd HH:mm:ss
  8. // 2001-03-07 14:00:00 yyyy-MM-dd HH:mm:ss
  9. // 2001/2/20 10:00 PM yyyy/MM/dd hh:mm a

代码

经过验证具体代码如下

代码语言:javascript
复制
package test.dateUtil;

import com.alibaba.excel.util.StringUtils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;

/**
 * @author kunZhi
 * @date 2023/4/22 19:40
 */
public class DateTest {
    public static void main(String[] args) {
        regex1("2001年02月10日");
        regex1("二〇一一年三月七日");
        regex1("2001/2/20");
        regex1("2001-2-20");
        regex1("20010220");
        regex1("20010220000000");
        regex1("2001/02/07 00:00:00");
        regex1("2001-03-07 14:00:00");
        regex1("2001/2/20 10:00 PM");
    }
    
    public static String convertChineseNumToArabicNum(String str) {
        String[] chineseNums = {"十月", "二十日", "三十日", "月十日", "二十", "三十", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "〇"};
        String[] arabicNums = {"10月", "20日", "30日", "月10日", "2", "3", "1", "2", "3", "4", "5", "6", "7", "8", "9", "1", "0"};

        for (int i = 0; i < chineseNums.length; i++) {
            str = str.replace(chineseNums[i], arabicNums[i]);
        }
        return str;
    }

    public static void regex1(String inputDateStr) {

        String patternDate = null;
        //2001年3月7日
        if (Pattern.compile("^\\d{4}年\\d{1,2}月\\d{1,2}日$").matcher(inputDateStr).matches()) {
            patternDate = "yyyy年M月d日";
        } else if (Pattern.compile("^二[零〇一二三四五六七八九]{1,3}年(十[一二]|[一-九])月(三十|三十一|十[一-九]|二十[一-九]|[一-九])日$").matcher(inputDateStr).matches()) {
            //二〇〇一年三月七日
            inputDateStr = convertChineseNumToArabicNum(inputDateStr);
            patternDate = "yyyy年M月d日";
        } else if (Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}$").matcher(inputDateStr).matches()) {
            //2001/3/7
            patternDate = "yyyy/M/d";
        } else if (Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2}$").matcher(inputDateStr).matches()) {
            //2001-3-7
            patternDate = "yyyy-MM-dd";
        } else if (Pattern.compile("^\\d{8}$").matcher(inputDateStr).matches()) {
            //20010307
            patternDate = "yyyyMMdd";
        } else if (Pattern.compile("^\\d{14}$").matcher(inputDateStr).matches()) {
            //20010307121212
            patternDate = "yyyyMMddHHmmss";
        } else if (Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:([0-5]\\d):([0-5]\\d)$").matcher(inputDateStr).matches()) {
            //2001/3/7 0:00
            patternDate = "yyyy/MM/dd HH:mm:ss";
        } else if (Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:([0-5]\\d):([0-5]\\d)$").matcher(inputDateStr).matches()) {
            //2001-3-7 0:00
            patternDate = "yyyy-MM-dd HH:mm:ss";
        }  else if (Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}\\s(0?\\d|1[0-2]):([0-5]\\d) (AM|PM)$").matcher(inputDateStr).matches()) {
            //2001/3/7 12:00 AM
            patternDate = "yyyy/MM/dd hh:mm a";
        } else {
            System.out.println("无法匹配的字符串 :" + inputDateStr);
        }

        if (!StringUtils.isEmpty(patternDate)) {
            Date inputDate = new Date();
            if (patternDate.equals("yyyy/MM/dd hh:mm a")) {
                DateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm a", Locale.ENGLISH);
                format.setLenient(false); // 设置为严格解析日期
                try {
                    inputDate = format.parse(inputDateStr);
                } catch (Exception e) {
                    System.out.println("解析日期字符串出错:" + e.getMessage());
                }
            } else {
                SimpleDateFormat inputDateFormat = new SimpleDateFormat(patternDate);
                inputDateFormat.setLenient(false); // 设置为严格解析日期
                // 解析输入字符串为Date对象
                try {
                    inputDate = inputDateFormat.parse(inputDateStr);
                } catch (Exception e) {
                    System.out.println("解析日期字符串出错:" + e.getMessage());
                }
            }

            // 将Date对象格式化为目标格式的字符串
            SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String outputDateStr = outputDateFormat.format(inputDate);
            System.out.println("输入字符串:" + inputDateStr + "目标格式的字符串:" + outputDateStr + "\n");
        }
    }
}

日期类型数据对应正则表达式

//2001年3月7日

  • “^\d{4}年\d{1,2}月\d{1,2}日$” “yyyy年M月d日”

//二〇〇一年三月七日

  • “^二[零〇一二三四五六七八九]{1,3}年(十[一二]|[一-九])月(三十|三十一|十[一-九]|二十[一-九]|[一-九])日$”
  • “yyyy年M月d日”

//2001/3/7

  • “^\d{4}/\d{1,2}/\d{1,2}$” “yyyy/M/d”

//2001-3-7

  • “^\d{4}-\d{1,2}-\d{1,2}$” “yyyy-MM-dd”

//20010307

  • “^\d{8}$”) “yyyyMMdd”

//20010307121212

  • “^\d{14}$” “yyyyMMddHHmmss”

//2001/3/7 0:00

  • “^\d{4}/\d{1,2}/\d{1,2}\s\d{1,2}😦[0-5]\d)😦[0-5]\d)$”
  • “yyyy/MM/dd HH:mm:ss”

//2001-3-7 0:00

  • “^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}😦[0-5]\d)😦[0-5]\d)$”
  • “yyyy-MM-dd HH:mm:ss”

//2001/3/7 12:00 AM

  • “^\d{4}/\d{1,2}/\d{1,2}\s(0?\d|1[0-2])😦[0-5]\d) (AM|PM)$”
  • “yyyy/MM/dd hh:mm a”
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 需求
    • 日期格式
    • 代码
  • 日期类型数据对应正则表达式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档