做項目過程中肯定會碰到這樣一個問題:在數據庫中存的是date或datetime類型的值,從數據庫里取出來遍歷到頁面上顯示的是long類型或是GTM類型的日期時間。
對於這個問題,經過研究之后有以下結論:
1.hibernate不會出現這樣的問題,而mabatis則會出現這個問題。
2.數據庫使用date類型的在頁面上會顯示long類型日期時間,使用datetime類型的在頁面上會顯示GTM類型日期時間。
因為我用的是mysql數據庫,其他的數據庫沒測試過,所以也不知道其他數據庫是怎樣的情況,這里就針對mybatis+mysql數據庫的情況來說一下我的解決方案吧。
通用解決方案:將實體類中的參數從Date類型換成String類型,一招治百病,但是如果不想通過這種方式解決的童鞋請往下看~
出現GTM時間(格林時間)的解決方案:
方案一(自定義,從后台着手解決問題):在后台把數據封裝到一個Map里,key為格式化之后的時間字符串,然后在前台遍歷map時,取值為{map.key}就行了。ps:自定義的解決方式,僅供參考~
方案二(推薦,從前端着手解決問題):之前沒想到jstl標簽庫也可以格式化處理數據這一茬,所以后來還是用的這種方案。本着能在前端解決的事絕不放在后台解決,減輕服務器壓力的原則,我果斷的選擇了這一種方法~(其實是這種方式簡單,想偷懶而已...)
普通web項目引入jar包,maven項目添加jstl依賴,添加依賴可參考:http://www.cnblogs.com/ggqzz/p/8421734.html
引入標簽:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
在遍歷日期的位置添加代碼
<fmt:formatDate type="both" value="${order.orderTime}" />
出現Long類型時間的解決方案:
方案一:jstl標簽庫fmt標簽,這個上面講過,就不多說了。
因為這一個項目是用easyui完成的,並且數據是由datagrid遍歷出來的,並沒有使用el表達式,所以我用的下面2種方式。
方案二:使用datagrid自帶formatter(格式化列)的屬性,可以直接定義函數,然后在需要格式化的列上加上formatter="函數名"(注意后面不需要加括號)的屬性就OK了。
自定義函數,實際上這也是js格式化時間的一種方式:
function formatDate(val) {
var date = new Date(val); var y = date.getFullYear(); var m = date.getMonth() + 1; var d = date.getDate(); return y + '-' + m + '-' + d; }
方式三(推薦):這種方式是使用jackson提供的注解,個人感覺還是很好用的~
先引入依賴:
<!-- jackson-databind依賴 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.2</version> </dependency>
在實體類Date類型屬性上加上注解:
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
private Date openDate;
注意:timezone="GMT+8"這個屬性必須加上,不然時區不對會導致日期的偏差!這種方式也格式化不了GTM時間!
以后如果有更多此問題的解決方案我也會繼續更新的,歡迎留言討論~