Cannot deserialize value of type `java.util.Date` from String “2020-09-21T07:25:20.000Z“

前台

      <el-form-item label="结束时间" prop="endDateTime">
        <el-date-picker v-model="form.endDateTime" style="width:100%;" type="datetime" placeholder="选择日期时间"></el-date-picker>
      </el-form-item>

后台vo层

/**
 * 结束时间
 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date endDateTime;

页面如下:
Cannot deserialize value of type `java.util.Date` from String “2020-09-21T07:25:20.000Z“_第1张图片

请求头异常信息:
Uncaught (in promise) Cannot deserialize value of type java.util.Date from String “2020-09-21T07:38:57.000Z”: expected format “yyyy-MM-dd HH:mm:ss”
at [Source: (PushbackInputStream); line: 1, column: 176] (through reference chain: com.jc.test23.platform.vo.TheOrderVO[“endDateTime”])

解决方法:
大体意思是说 前台向后台发起请求时,DateTimeFormat 接收到的前台参数为String,无法将String转变为Date

经过去网上查询资料后,修改 vo层代码:

/**
 * 结束时间
 */
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd'T'HH:mm:ss")
private Date endDateTime;

yyyy-MM-dd HH:mm:ss 改为 yyyy-MM-dd’T’HH:mm:ss

问题解决

另外查询一下, pattern中的T 是什么意思?在此做了一个记录(摘抄自https://blog.csdn.net/jim_LoveQ/article/details/107457771)

单个时间点可以通过连接完整的日期表达式、字母“T”作为分隔符和有效的时间表达式来表示。例如,“2007-04-05T14:30”。如“200704051430”中所述,经双方同意,允许省略“T”字符。[31]ISO 8601中不允许使用空格等其他字符分隔日期和时间部分,但允许在其配置文件RFC 3339中使用。[32]
如果需要时区指示符,它将跟随合并的日期和时间。例如,“2007-04-05T14:30Z”或“2007-04-05T12:30-02:00”。
可以使用基本格式或扩展格式,但日期和时间必须使用相同的格式。日期表达式可以是日历、周或序数,并且必须使用完整的表示形式。时间可以用指定的降低精度的格式来表示。[17]
持续时间定义了一个时间间隔中的干预时间量,并用格式P[n]Y[n]M[n]DT[n]H[n]M[n]S或P[n]W表示。在这些表示中,[n]被后面的每个日期和时间元素的值替换。不需要前导零,但每个元素的最大位数应由通信方商定。大写字母P、Y、M、W、D、T、H、M和S是每个日期和时间元素的指示符,不会被替换。
P是放置在持续时间表示开始处的持续时间指示符(表示期间)。
Y是年数值之后的年份指示符。
M是月数值之后的月份指示符。
W是周数值之后的周指示符。
D是天数值后面的日期指示符。
T是表示的时间分量之前的时间指示符。
H是小时数值之后的小时指示符。
M是分钟数值之后的分钟指示符。
S是秒数值后面的第二个指示符。
例如,“P3Y6M4DT12H30M5S”表示“三年六个月四天十二小时三十分五秒”的持续时间。
如果日期和时间元素的值为零,则可以省略包括其指示符的日期和时间元素,并且为了降低精度,也可以省略低阶元素。例如,“P23DT23H”和“P4Y”都是可接受的持续时间表示。但是,必须至少存在一个元素,因此“P”在0秒的持续时间内不是有效的表示然而,“PT0S”或“P0D”都是有效的,并且表示相同的持续时间。
为了解决歧义,“P1M”是一个月的持续时间,“PT1M”是一分钟的持续时间(注意时间值前面的时间指示符T)。使用的最小值也可以有小数,如“P0.5Y”表示半年。小数可以用逗号或句号指定,如“P0,5Y”或“P0.5Y”。本标准不禁止持续时间表示中的日期和时间值超过其“结转点”,除非下文另有说明。因此,“PT36H”和“P1DT12H”可用于表示相同的持续时间。但请记住,当切换到夏令时时,“PT36H”与“P1DT12H”不同。
或者,基于组合的日期和时间表示的持续时间格式可以通过通信双方之间的协议以基本格式PYYYYMMDDThhmmss或扩展格式P[YYYY]-[MM]-[DD]T[hh][MM][ss]使用。例如,上面显示的第一个持续时间是“P0003-06-04T12:30:05”。但是,单个日期和时间值不能超过其模数(例如,不允许月值为13或小时值为25)。[33]
尽管标准将持续时间描述为时间间隔的一部分,下一节将对此进行讨论,但是持续时间格式(或其子集)被广泛使用,独立于时间间隔,就像java8 duration类一样。[34][35]```

你可能感兴趣的:(java)