日期相關-1

對相同的表執行了不同的sql,返回相同的日期Date頁面得到的數據卻不同。
這裏寫圖片描述
這裏寫圖片描述
不同之處在於:
上面取回的數據使用了Mybatis的攔截器進行分頁,下面的是直接用了對bean的映射返回的。前者應該是調用了Date的getTime()方法,後者直接放回了Date對象,但是在用EL表達式取值的時候,自動調用了toString()方法。
在下面的取值方式中,可以使用jstl的<fmt>對date對象進行格式轉換。但是上面返回的long類型的時間就不能格式轉換了。

<fmt:formatDate value="${tfFCardcoupons.cardEndTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
<!--只能傳入date對象-->

實驗:

fmt:formatDate value="<%=date.getTime() %>" pattern="yyyy-MM-dd HH:mm:ss"/>
fmt:formatDate value="<%=date.toString() %>" pattern="yyyy-MM-dd HH:mm:ss"/>

這裏寫圖片描述
都會報錯。


總結:用了PageHelper攔截器,得到的數據返回給了js,需要將long的時間還原爲date對象,才能正確顯示時間。不過幸好,可領取卡券頁並沒有要顯示時間。


java中的時間API

  1. java.util.Date
  2. java.text.DateFormat
  3. java.util.Calendar

基本使用

//得到當前時間
 Date date = new Date();
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 df.format(date);//2017-07-03 00:55:02
 //對Date設定特定的時間
 Date dt = df.parse("2017-06-19 00:00:00");
 System.out.println(date.toString());//Mon Jun 19  00:00:00 CST 2017
 //向oracle數據庫插入特定的時間戳

java.util.Date是機器時間

兩個構造函數

Date date = new Date(System.currentTimeMillis());
Date date = new Date();//內部也是通過系統的epoch毫秒數但會date對象的

用date對象得到得到從1970年1月1日0分0秒0毫秒(Unix餘年)至今的毫秒數

date.getTime();

除了上面的兩個構造函數,和getTime()函數,其他的構造函數以及get方法set方法都已經廢除,因此,不應該對date對象進行設置值,date的唯一作用就是得到epoch,而操作date需要用到java.text.DateFormat抽象類。

格式化時間日期的DateFormat

基本使用由兩種
第一種用SimpleDateFormat的format()方法傳入date對象
第二種是用DateFormat的三個靜態方法

//DATE
getDateInstance(LONG).format(new Date());
getDateInstance(SHORT).format(new Date());
//TIME
getTimeInstance(LONG).format(new Date());
getTimeInstance(MEDIUM).format(new Date());
getTimeInstance(SHORT).format(new Date());
//date time 2*3=6種格式
getDateTimeInstance(LONG,LONG).format(new Date());
getDateTimeInstance(LONG,MEDIUM).format(new Date());
getDateTimeInstance(LONG,SHORT).format(new Date());

處理時間日期的Calendar

Date應該作爲時間軸上的瞬時代表,要格式化時間日期通過DateFormat,如果要去的某個時間日期信息,或者對時間日期進行操作,可以使用Calendar實例。
Calendar是個抽象類,java.util.GergorianCalendar是其子類,操作了儒略曆和格里高歷的混合歷。通過Calendar的getInstance()去的的Calendar實例,默認就是取得GergorianCalendar實例。

儒略曆和格力高歷

1582年頒佈,將儒略曆的1582年18月3日星期四的隔天,定爲格力高歷1582年10月15日星期五。
各個國家改歷的事件不同,英國的改歷事件在1752年9月初,因此在Unix/Linux中查詢1752年月曆,9月份會平白少了11天。
這裏寫圖片描述
我的新bash背景好好看。
在java的Calendar中也可以看到1582年的時間變化
這裏寫圖片描述
Calendar的常用方法:
輸入年月,輸出當年當月的日曆。
這裏寫圖片描述

這裏寫圖片描述


JDK8新時間日期API

  1. java.time.*
  2. java.time.chrono.* –年曆設計系統

構造方法–不是用new 而是用靜態方法進行構造

LocalTime localTime = LocalTime.of(0,0,0);
LocalDate localDate = LocalDate.of(2017,7.2)
//常用方法:plusDays() plusMonths() plusWeeks()都是返回一個新的LocalDate對象
//of返回的都是一個新的localTime或者localDate對象
//跟被lombok的@getter和@setter註解過的屬性一樣
//Fluent API 概念
System.out.println(LocalDate.of(2017.7.2).plusDays(5).plusMonths(5).plusWeeks(3).format(ofPattern(E MM/dd/yyyy)));
//每調用一個方法,返回一個新對象,內存不會炸嗎,堆夠用嗎,那就是夠用吧,垃圾回收。java真是智能。

JDK8的java.time套件中的類採用的的是單一的ISO8601年曆系統

ISO8601

iso8601不是年曆系統,而是時間日期表示方法的標準。iso8601在數據定義上大部分與格力高歷相同,也有的輕微差別例如:iso8601中定義19世紀是指1900年至1999年(包含該年)[iso8601認爲我們現在是20世紀啊,跟我們現在的生活不符呢],格力高歷的19世紀是1801年值1900年(包含該年).
如果需要其他年曆系統,引入java.time.chrono.*操作的java.time.chrono.Chronology接口的類。

LocalDate birth = LocalDate.of(1975,5,26);
MinguoDate  mingoBirth = MinguoDate.from(birth);
System.out.println(mingoBirth);//Minguo ROC 64-05-26
//民國日曆與當前日期的轉換

System.out.println(MinguoDate.of(64,5,1).atTime(LocalTime.of(3,30,0)));//民國64年5月1日3時30分

總結

  1. Date一般不操作時間,只用DateFormat抽象類按格式輸出那個時間戳的事件
  2. 操作時間戳用java.util.Calendar
  3. 由於java.util.Calendar有很多枚舉值,因此jdk8操作時間API是面向人的API,操作更方便。
  4. java的時間和日期還是挺複雜的啊,學了一些內容,以後遇到再學吧。

我要記住的只是:

Date date = new Date();//
date.getTime();//用來比較時間
<fmt:formatDate value="date對象實例" pattern="yyyy-MM-dd HH:mm:ss"/> <!--在頁面上格式化顯示時間-->
update tf_f_coupon set card_end_time = toDate('2017-06-30','yyyy-mm-dd hh24:mi:ss ')
where card_id='43' --調整卡券的時間進行測試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章