天天看點

springmvc項目中關于時間展示

      最近在做一個項目的時候,我在輸入端使用日期控件輸入标準的日期格式,然後資料庫也設定成了日期類型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