最近在做一個項目的時候,我在輸入端使用日期控件輸入标準的日期格式,然後資料庫也設定成了日期類型date,想讓其展示成2018-05-08,而程式好像和我作對,結果展示成了2018-05-08 00:00:00.0。很是苦惱,于是查了很多資料,總結在這裡。
目标:我想在我的系統中日期和日期時間共同存在。
第一步引入jar:
<!-- jackson begin -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- jackson end -->
<!-- 阿裡巴巴json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 日期幫助類,很強大 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
第二步:在我們spring.xml中配置:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<!-- 将StringHttpMessageConverter的預設編碼設為UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<!-- 下載下傳使用 -->
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceRegionHttpMessageConverter"/>
<!-- json -->
<ref bean="jacksonMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
我們在第二步中,有一個jacksonObjectMapper沒有找到對應的bean。是以我們的程式,必須建立一個bean Class,來與之對應bean引用
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 解決Jackson 差8小時的問題
*/
@Component("jacksonObjectMapper")
public class JacksonObjectMapper extends ObjectMapper {
private static final long serialVersionUID = 4288193147502386170L;
private static final Locale CHINA = Locale.CHINA;
public JacksonObjectMapper() {
this.setLocale(CHINA);
this.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", CHINA));
this.setTimeZone(TimeZone.getTimeZone("GMT+8"));
}
}
必須配置@Component("jacksonObjectMapper") 這個與xml中bean的引用相同,不然程式會報錯。不知道的,請自行Spring的知識
第三步:
還沒完喲,我們知道我們從前端輸入的時候都是Sting類型,怎麼把他轉換成Date類型呢?此時要借助Controller中initBinder方法。我們可以讓自己的controller繼承一個公共的Controller類,這樣自己的Controller就擁有這個方法了,就會自己進行初始化對日期/數字等類型都可以在這裡設定。
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
/**
* 自動轉換日期類型的字段格式
*/
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
第四步:
我們在第三步中隻控制了Springmvc的輸入,那麼輸出呢,是不是也需要設定呢?我們知道SpringMVC中輸出是基于模型輸出的,那麼就需要在模型層配置。
于是:
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
private Date StateTime;
這裡必須要timezone,因為程式有時差之分,切記。
配置了這些我們解決了問題麼,發現還沒有。老天啊,要不要這麼折磨我,于是查資料,發現實體類中的Date有兩種來源
java.util.Date; 和 java.sql.Date; 二者差別自行百度。
于是将java.util.Date更換為java.sql.Date,輕松解決問題。
第五步總結:
在我的程式中,我将日期使用java.sql.Date,
将日期時間使用java.sql.Timestamp