项目需求,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多年
日期不精确,所以分开处理。具体原因不清楚,如有知道的,欢迎留言。