1. 程式人生 > >springboot專案中關於時間型別轉換的格式問題

springboot專案中關於時間型別轉換的格式問題

常常專案裡轉時間型別出現如下錯誤。

Can not deserialize value of type java.util.Date from String \"2018-10-24 12:12:12\"
: not a valid representation
 (error: Failed to parse Date value '2018-10-24 12:12:12': Can not parse date
  \"2018-10-24 12:12:12Z\": while it seems to
   fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', parsing fails (leniency? null))\n 
  ...

其實,在我們springboot專案裡對於傳入傳出引數中的時間型別格式化有很多方法,有一種比較簡單的:

  這種方式是最簡單配置的,但是也限制了所有的介面,必須按照配置好的格式傳入傳出時間型別。當然,也有辦法解決前端傳入引數不匹配的問題,後邊會說。

1、最簡單的配置如下:

找到application.properties 檔案,在其中加入下面這兩行

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

  其中,yyyy-MM-dd HH:mm:ss 可以寫為yyyy-MM-dd hh:mm:ss

。如果這種格式,表示傳入傳出引數必須要帶有時分秒。如下的傳入引數:

{
  "countmj": "string",
  "creatdate": "2018-10-24 12:12:12"
}
controller中的寫法:
@RestController
@RequestMapping("/test")
public class Test1Controller extends BaseController{


    @RequestMapping(value="/postone",method = RequestMethod.POST)
    public Object getTest1(@RequestBody CqjyZcfxx zcfxx){
        if(zcfxx == null){
            return addResultMapMsg(false,"引數為空");
        }
        System.out.println(zcfxx.getCreatdate());
        return addResultMapMsg(true,zcfxx);
    }
}

  其中介面部分post 請求的還可以如下寫法:


    @PostMapping("/posttwo")
    public Object getTest2(@RequestBody CqjyZcfxx zcfxx){
        if(zcfxx == null){
            return addResultMapMsg(false,"引數為空");
        }
        zcfxx.setCreatdate(new Date());
        return addResultMapMsg(true,zcfxx);
    }

  另外get 請求的寫法如下:


    @GetMapping("/gettwo")
    public Object getTest2(CqjyZcfxx zcfxx){
        if(zcfxx == null){
            return addResultMapMsg(false,"引數為空");
        }
        zcfxx.setCreatdate(new Date());
        return addResultMapMsg(true,zcfxx);
    }

  但是,千萬別如下這種寫法,get 請求不支援@RequestBody 的。


    @GetMapping("/getone")
    public Object getTest1(@RequestBody CqjyZcfxx zcfxx){
        if(zcfxx == null){
            return addResultMapMsg(false,"引數為空");
        }
        System.out.println(zcfxx.getCreatdate());
        return addResultMapMsg(true,zcfxx);
    }

傳入引數不匹配的問題

  當然我們可能還有這樣的問題,不同的前端人員,可能用不同的格式對你的小date傳入,比如是時間戳丟給你,date表示式丟給你,明明你是年月日時分秒,他非要給你個年月日,等等。那改怎麼辦呢?    如果出現了這種情況,也好辦,只不過需要變一下接收辦法即可。方法有兩種:

1、ObjectMapper 類接收json的方式

   ObjectMapper 這個不需要引包,只需要在controller 裡這麼寫:

    @RequestMapping(value="/add",method = RequestMethod.POST)
    public Object addUser(@RequestBody String req){
       ObjectMapper jsonTranster = new ObjectMapper().setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
        CqjyXmtp cqjyXmtp = null;
        try{
            cqjyXmtp = jsonTranster.readValue(req, CqjyXmtp.class);
        }catch (Exception e) {
            e.printStackTrace();
            return false;
        }
2、Gson 類接收json的方式

   還有一種,是以Gson 的方式轉json串,這個需要引入包,我引的是下邊的依賴:

 <dependency>
  		<groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
       <version>2.8.0</version>
   </dependency>

寫法差不多:

  @RequestMapping(value="/add",method = RequestMethod.POST)
    public Object addUser(@RequestBody String req){
       Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
        CqjyXmtp cqjyXmtp = null;
        try{
            cqjyXmtp = gson.fromJson(req,CqjyXmtp .class);
        }catch (Exception e) {
            e.printStackTrace();
            return false;
        }

  如果沒什麼特殊要求,我覺得,用第一種最好!