EasyExcel 时间转换 Date LocalDate LocalDateTime

文章介绍了使用ApachePOI库中的Hutool工具类实现的三个日期时间转换器:DateConverter处理yyyy-MM-dd和yyyy-MM-ddHH:mm:ss格式,LocalDateConverter专为LocalDate设计,LocalDateTimeConverter则针对LocalDateTime。它们用于Excel数据转换,确保日期时间格式正确性。
摘要由CSDN通过智能技术生成

DateConverter

import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author zph
 * @date 2024/4/19 14:58
 */
public class DateConverter implements Converter<Date> {

    /**
     * date转换
     */
    static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * dateTime转换
     */
    static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Class<Date> supportJavaTypeKey() {
        return Date.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Date convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                  GlobalConfiguration globalConfiguration) {
        //根据时间类型来处理日期
        if (cellData.getType() == CellDataTypeEnum.NUMBER) {
            return HSSFDateUtil.getJavaDate(Double.parseDouble(StrUtil.toString(cellData.getNumberValue())));
        } else if (cellData.getType() == CellDataTypeEnum.STRING) {
            String value = cellData.getStringValue().replace("/", "-").replace(".", "-");
            Date date;
            try {
                if (value.length() <= 10) {
                    date = DATE_FORMAT.parse(value);
                } else {
                    date = DATE_TIME_FORMAT.parse(value);
                }
            } catch (Exception e) {
                throw new RuntimeException("日期时间格式错误 请修改为 'yyyy-MM-dd'或'yyyy-MM-dd HH:mm:ss' 格式");
            }
            return date;
        } else {
            return null;
        }
    }

    @Override
    public CellData<String> convertToExcelData(Date value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        return new CellData<>(DATE_TIME_FORMAT.format(value));
    }

}

LocalDateConverter

import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author zph
 * @date 2024/4/19 15:08
 */
public class LocalDateConverter implements Converter<LocalDate> {

    static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @Override
    public Class<LocalDate> supportJavaTypeKey() {
        return LocalDate.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                       GlobalConfiguration globalConfiguration) {
        //根据时间类型来处理日期
        if (cellData.getType() == CellDataTypeEnum.NUMBER) {
            Date date = HSSFDateUtil.getJavaDate(Double.parseDouble(StrUtil.toString(cellData.getNumberValue())));
            return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        } else if (cellData.getType() == CellDataTypeEnum.STRING) {
            String value = cellData.getStringValue().replace("/", "-").replace(".", "-");
            LocalDate localDate;
            try {
                //2022-1-1 这种也应该支持
                String[] strings = value.split("-");
                value = strings[0] + "-" + StrUtil.fillBefore(strings[1], '0', 2) + "-" + StrUtil.fillBefore(strings[2], '0', 2);
                localDate = LocalDate.parse(value, FORMATTER);
            } catch (Exception e) {
                throw new RuntimeException("日期时间格式错误 请修改为 'yyyy-MM-dd'格式");
            }
            return localDate;
        } else {
            return null;
        }
    }

    @Override
    public CellData<String> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        return new CellData<>(value.format(FORMATTER));
    }

}

LocalDateTimeConverter

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author zph
 * @date 2024/4/19 15:08
 */
public class LocalDateTimeConverter implements Converter<LocalDateTime> {


    static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public Class<LocalDateTime> supportJavaTypeKey() {
        return LocalDateTime.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                           GlobalConfiguration globalConfiguration) {
        if (CellDataTypeEnum.NUMBER.equals(cellData.getType())) {
            Date date = HSSFDateUtil.getJavaDate(cellData.getNumberValue().doubleValue());
            return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        } else if (CellDataTypeEnum.STRING.equals(cellData.getType())) {
            String value = cellData.getStringValue().replace("/", "-");
            if (value.length() <= 10) {
                value = value + " 00:00:00";
            }
            LocalDateTime dateTime;
            try {
                dateTime = LocalDateTime.parse(value, FORMATTER);
            } catch (Exception e) {
                throw new RuntimeException("日期时间格式错误 请修改为 'yyyy-MM-dd HH:mm:ss'格式");
            }
            return dateTime;
        } else {
            return null;
        }
    }

    @Override
    public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        return new CellData<>(value.format(FORMATTER));
    }

}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值