1. 程式人生 > >SpringMVC日期時間格式化方式

SpringMVC日期時間格式化方式

### 引入 平時,在寫前端頁面時,很有可能會涉及到表單中有日期的情況,一般情況下不同的業務使用的日期格式都有所不同。下面看下一個簡單的例子說明SpringMVC對日期的處理。 jsp頁面如下(簡單的表單,其中有一個輸入框中輸入的是日期時間):
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv
="Content-Type" content="text/html; charset=UTF-8">
</head> <body> <form id="addForm" action="<c:url value='/doAdd'/>" method="POST" > <input type="text" name="name" value="測試"/> <input type="text" name="birthtime" value="2017-10-10 10:10"/> <button type="submit"
>
儲存</button> </form> </body> </html> `` POJO如下: ```java public class User{ private String name; private Date birthtime; // 屬性的setter/getter方法略 } <div class="se-preview-section-delimiter"></div>
Controller如下:
@Controller
public class TestFileController
{
@RequestMapping("/doAdd") public void doAdd(@ModelAttribute User user, HttpServletRequest request){ System.out.println(user.getName()); System.out.println(user.getBirthtime()); } } <div class="se-preview-section-delimiter"></div>
此時,SpringMVC會爆出異常: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object ‘user’ on field ‘birthtime’: rejected value [2017-10-10 10:10]; codes [typeMismatch.user.birthtime,typeMismatch.birthtime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.birthtime,birthtime]; arguments []; default message [birthtime]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birthtime’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value ‘2017-10-10 10:10’; nested exception is java.lang.IllegalArgumentException] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:113) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

此異常是什麼意思呢?很明顯,輸入的字串’2017-10-10 10:10’不能轉換為Date型別。所以下面要做的就是把前端的字串形式的日期轉換為java.util.Date型別。

SpringMVC日期處理

處理前端到控制器的日期有兩種方式:(當前不止兩種了!)
1. 在控制器中使用@InitBind註解
2. 在POJO中日期屬性上新增@DateTimeFormat

方式1:在控制器中使用@InitBind註解

@Controller
public class TestFileController {

    @InitBinder
    public void initBind(WebDataBinder binder){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");  
        dateFormat.setLenient(false);  
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));   
    }

    @RequestMapping("/doAdd")
    public void doAdd(@ModelAttribute User user, HttpServletRequest request){
        System.out.println(user.getName());
        System.out.println(user.getBirthtime());
    }
}




<div class="se-preview-section-delimiter"></div>

方式2:在POJO中日期屬性上新增@DateTimeFormat

public class User{
    private String name;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date birthtime;

    // 屬性的setter/getter方法略
}

參考