使用excel导入功能时日期数据变成数字的解决

当使用excel导入功能处理日期数据时,1900年之后的日期可能显示为数字。这是因为excel将这些日期解析为从1900年开始的天数。解决方法包括:1) 对1900年前的正常日期文本直接转换;2) 对数字形式的日期进行加法运算以还原日期,特别注意要处理1900-02-29的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用excel导入功能时日期数据变成数字的解决

在使用excel导入功能的时候,难免会导入日期类型的数据,这个时候无论使用easyexcel还是poi的导入方式,都有可能出现纯数字的日期。
1、如果输入的日期是1900年之前的,则不会变成纯数字;
2、如果是1900年之后的日期,则在导入的时候可能会变成数字:
原因
从这张图里面就能看出来原因:excel解析时间类型的数据的时候把日期转成文本类型了。
那么这个数字代表什么呢?
这个数字与上面提到的1900年相关,因为excel中的时间是从1900年开始的,而转换成文本类型的数字则代表着1900年之后的N天,知道这个原理之后,就很好解决这个问题了:
1)如果是正常的时间类型则进行日期转换(1900年之前日期是正常的文本类型);
2)如果是纯数字则进行日期的加法运算。
这个时候需要注意一点的是:1900-02-29这一天是不存在的,但是在excel中是可以输入并转换成数字的,所以需要特殊处理一下,整体处理的代码如下:

private String judgeMemberBirthday(MemberInfo member) {
    /**
     * 正整数判断(不包含0)
     */
    private final Pattern pattern = Pattern.compile("^[1-9]\\d*$");

    /**
     * excel中的起始时间
     */
    private final LocalDate excelStart = LocalDate.of(1899, 12, 31);
	//开始执行
        try {
            //超过10位,不满足年月日格式
            if (member.getBirthday().length() > 10) {
                return "生日格式有误";
            }
            //日期转换格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            //将字符串日期进行格式化,如果出现异常,说明不是日期格式的
            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-M-d");
            LocalDate date = LocalDate.parse(member.getBirthday(), df);
            member.setBirthday(date);
            return null;
        } catch (Exception e) {
            //如果是纯数字,可能是excel中是日期格式转成了文本格式
            if (pattern.matcher(member.getBirthday()).matches()) {
                if (Integer.valueOf(member.getBirthday()) > 60) {
                    LocalDate localDate = excelStart.plusDays(Integer.valueOf(member.getBirthday()) - 1);
                    if (localDate.isAfter(LocalDate.now())) {
                        return "生日格式有误";
                    }
                    member.setBirthday(localDate);
                    return null;
                } else if (Integer.valueOf(member.getBirthday()) < 60) {
                    LocalDate localDate = excelStart.plusDays(Integer.valueOf(member.getBirthday()));
                    member.setBirthday(localDate);
                    return null;
                } else {
                    return "生日格式有误";
                }
            } else {
                return "生日格式有误";
            }
        }
    }

欢迎评论收藏,如需转载,转贴请注明出处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值