0
点赞
收藏
分享

微信扫一扫

若依POI导入Excel多种日期格式转换为一种

自由情感小屋 2022-03-12 阅读 160
java

项目需求,excel表格里有多种日期的字段,可能单元为date的,也可能为文本的自己手动填写的,要求后台保存为统一格式,yyyy/MM/dd。

因为数据库的日期字段的类型为字符串,所以保存到数据库的实体类,日期必须为String。

这里设置了一个实体

 @Excel(name = "Est. Start Date",dateFormat = "yyyy/MM/dd") // 没有也可以 无需纠结于这里
    private Date estStrartDate;
    @Excel(name = "Est. End Date",dateFormat = "yyyy/MM/dd")  
    private Date estEndDate;

    public Date getEstStrartDate() {
        return estStrartDate;
    }

    public void setEstStrartDate(Date estStrartDate) {
        this.estStrartDate = estStrartDate;
    }

    public Date getEstEndDate() {
        return estEndDate;
    }

    public void setEstEndDate(Date estEndDate) {
        this.estEndDate = estEndDate;
    }

    private  String estStrartDateStr;
    private  String estEndDateStr;
    //处理日期转换为字符串   真正映射数据库日期的字段
    public String getEstStrartDateStr() {
        return  this.estStrartDate == null?"":DateUtils.parseDateToStr("yyyy/MM/dd", (Date)this.estStrartDate );
    }

    public String getEstEndDateStr() {
        return  this.estEndDate == null?"":DateUtils.parseDateToStr("yyyy/MM/dd", (Date)this.estEndDate );
    }

实体创建完毕。

导入Excel,单元格样式为date的,不论是 2021/1/2、2021-01-02、还是全部大写的,只要为date的 后台date接收的格式都为类似于这种 Sat May 12 00:00:00 CST 1990。

现在思路来了,date的这么统一,那么难点就剩手填的文本了,将文本的一些常用的格式收起来,String 转为date类型,也转为这种 Sat May 12 00:00:00 CST 1990。

    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
    private static String[] parsePatterns1 = {
            "MM-dd-yyyy", "MM/dd/yyyy"};
    private static String[] parsePatterns2 = {
            "yyyy年MM月dd日"};



    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str)
    {
        if (str == null)
        {
            return null;
        }
        try
        {
            if(str.toString().split("-")[0].length()==4||str.toString().split("/")[0].length()==4||str.toString().split("/")[0].length()==4){
                return parseDate(str.toString(), parsePatterns);
            }else if(str.toString().split("年")[0].length()==4){
            return parseDate(str.toString(), parsePatterns2);
        }else{
                return parseDate(str.toString(), parsePatterns1);
            }
        }
        catch (ParseException e)
        {
            return null;
        }
    }

不是这里格式的都是无效日期,得到的都为null。全部转为date后实体类里的处理日期转换为字符串发生作用,保存到数据库。

注意事项

年月日,月日年的需要分开,不然转换的话会发生日期不一致,严重的,年都给你弄丢2000多年

日期不精确,所以分开处理。具体原因不清楚,如有知道的,欢迎留言。

举报

相关推荐

0 条评论