這篇文章主要介紹了如何在Java項目中使用時間日期API,此處通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考價值,需要的朋友可以參考下:
創(chuàng)新互聯(lián)專注于鼓樓網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供鼓樓營銷型網(wǎng)站建設(shè),鼓樓網(wǎng)站制作、鼓樓網(wǎng)頁設(shè)計、鼓樓網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造鼓樓網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鼓樓網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
Java是一門面向?qū)ο缶幊陶Z言,可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。
世界上所有的計算機內(nèi)部存儲時間都使用一個 long 類型的整數(shù),而這個整數(shù)的值就是相對于英國格林尼治標(biāo)準(zhǔn)時間(1970年1月1日0時0分0秒)的毫秒數(shù)。例如:
public static void main(String[] args){ //January 1, 1970 00:00:00 GMT. Date date = new Date(1000); System.out.println(date); }
輸出結(jié)果:
//1970-1-1 8:00:01 Thu Jan 01 08:00:01 CST 1970
很多人可能會疑惑,1000 表示的是距離標(biāo)準(zhǔn)時間往后 1 秒,那為什么時間卻多走了 八個小時?
這和「時區(qū)」有關(guān)系,如果你位于英國的格林尼治區(qū),那么結(jié)果會如預(yù)想一樣,但是我們位于中國東八區(qū),時間要早八個小時,所以不同時區(qū)基于的基礎(chǔ)值不同。
Date 這個類以前真的扮演過很多角色,從它的源碼就可以看出來,有可以操作時刻的方法,有可以操作年月日的方法,甚至它還能管時區(qū)??梢哉f,日期時間的相關(guān)操作有它一個人就足夠了。
但這個世界就是這樣,你管的東西多了,自然就不能面面俱到,Date 中很多方法的設(shè)計并不是很合理,之前我們也說了,甚至有點反人類。所以,現(xiàn)在的 Date 類中接近百分之八十的方法都已廢棄,被標(biāo)記為 @Deprecated。
sun 公司給 Date 的目前定位是,唯一表示一個時刻,所以它的內(nèi)部應(yīng)該圍繞著那個整型的毫秒,而不再著重于各種年歷時區(qū)等信息。
Date 允許通過以下兩種構(gòu)造器實例化一個對象:
private transient long fastTime; public Date() { this(System.currentTimeMillis()); } public Date(long date) { fastTime = date; }
這里的 fastTime 屬性存儲的就是時刻所對應(yīng)的毫秒數(shù),兩個構(gòu)造器還是很簡單,如果調(diào)用的是無參構(gòu)造器,那么虛擬機將以系統(tǒng)當(dāng)前的時刻值對 fastTime 進(jìn)行賦值。
還有幾個為數(shù)不多沒有被廢棄的方法:
public long getTime() :返回內(nèi)部存儲的毫秒數(shù)
public void setTime(long time):重新設(shè)置內(nèi)存的毫秒數(shù)
public boolean before(Date when):比較給定的時刻是否早于當(dāng)前 Date 實例
public boolean after(Date when):比較給定的時刻是否晚于當(dāng)前 Date 實例
還有兩個方法是 jdk1.8 以后新增的,用于向 Java 8 新增接口的轉(zhuǎn)換,待會介紹。
描述年歷的 Calendar
Calendar 用于表示年月日等日期信息,它是一個抽象類,所以一般通過以下四種工廠方法獲取它的實例對象。
public static Calendar getInstance() public static Calendar getInstance(TimeZone zone) public static Calendar getInstance(Locale aLocale) public static Calendar getInstance(TimeZone zone,Locale aLocale)
其實內(nèi)部最終會調(diào)用同一個內(nèi)部方法:
private static Calendar createCalendar(TimeZone zone,Locale aLocale)
該方法需要兩個參數(shù),一個是時區(qū),一個是國家和語言,也就是說,構(gòu)建一個 Calendar 實例最少需要提供這兩個參數(shù)信息,否則將會使用系統(tǒng)默認(rèn)的時區(qū)或語言信息。
因為不同的時區(qū)與國家語言對于時刻和年月日信息的輸出是不同的,所以這也是為什么一個 Calendar 實例必須傳入時區(qū)和國家信息的一個原因??磦€例子:
public static void main(String[] args){ Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getTime()); Calendar calendar1 = Calendar.getInstance (TimeZone.getTimeZone("GMT"), Locale.ENGLISH); System.out.println( calendar1.get(Calendar.YEAR) + ":" + calendar1.get(Calendar.HOUR) + ":" + calendar1.get(Calendar.MINUTE)); }
輸出結(jié)果:
Sat Apr 21 10:32:20 CST 2018 2018:2:32
可以看到,第一個輸出為我們系統(tǒng)默認(rèn)時區(qū)與國家的當(dāng)前時間,而第二個 Calendar 實例我們指定了它位于格林尼治時區(qū)(0 時區(qū)),結(jié)果也顯而易見了,相差了八個小時,那是因為我們位于東八區(qū),時間早于 0 時區(qū)八個小時。
可能有人會疑惑了,為什么第二個 Calendar 實例的輸出要如此復(fù)雜的拼接,而不像第一個 Calendar 實例那樣直接調(diào)用 getTime 方法簡潔呢?
這涉及到 Calendar 的內(nèi)部實現(xiàn),我們一起看看:
protected long time; public final Date getTime() { return new Date(getTimeInMillis()); }
和 Date 一樣,Calendar 的內(nèi)部也維護(hù)著一個時刻信息,而 getTime 方法實際上是根據(jù)這個時刻構(gòu)建了一個 Date 對象并返回的。
而一般我們構(gòu)建 Calendar 實例的時候都不會傳入一個時刻信息,所以這個 time 的值在實例初始化的時候,程序會根據(jù)系統(tǒng)默認(rèn)的時區(qū)和當(dāng)前時間計算得到一個毫秒數(shù)并賦值給 time。
所以,所有未手動修改 time 屬性值的 Calendar 實例的內(nèi)部,time 的值都是當(dāng)時系統(tǒng)默認(rèn)時區(qū)的時刻數(shù)值。也就是說,getTime 的輸出結(jié)果是不會理會當(dāng)前實例所對應(yīng)的時區(qū)信息的,這也是我覺得 Calendar 設(shè)計的一個缺陷所在,因為這樣會導(dǎo)致兩個不同時區(qū) Calendar 實例的 getTime 輸出值只取決于實例初始化時系統(tǒng)的運行時刻。
Calendar 中也定義了很多靜態(tài)常量和一些屬性數(shù)組:
public final static int ERA = 0; public final static int YEAR = 1; public final static int MONTH = 2; public final static int WEEK_OF_YEAR = 3; public final static int WEEK_OF_MONTH = 4; public final static int DATE = 5; .... protected int fields[]; protected boolean isSet[]; ...
有關(guān)日期的所有相關(guān)信息都存儲在屬性數(shù)組中,而這些靜態(tài)常量的值往往表示的就是一個索引值,通過 get 方法,我們傳入一個屬性索引,返回得到該屬性的值。例如:
Calendar myCalendar = Calendar.getInstance(); int year = myCalendar.get(Calendar.YEAR);
這里的 get 方法實際上就是直接取的 fields[1] 作為返回值,而 fields 屬性數(shù)組在 Calendar 實例初始化的時候就已經(jīng)由系統(tǒng)根據(jù)時區(qū)和語言計算并賦值了,注意,這里會根據(jù)你指定的時區(qū)進(jìn)行計算,它不像 time 始終是依照的系統(tǒng)默認(rèn)時區(qū)。
個人覺得 Calendar 的設(shè)計有優(yōu)雅的地方,也有不合理的地方,畢竟是個「古董」了,終將被替代。
DateFormat 格式化轉(zhuǎn)換
從我們之前的一個例子中可以看到,Calendar 想要輸出一個預(yù)期格式的日期信息是很麻煩的,需要自己手動拼接。而我們的 DateFormat 就是用來處理格式化字符串和日期時間之間的轉(zhuǎn)換操作的。
DateFormat 和 Calendar 一樣,也是一個抽象類,我們需要通過工廠方式產(chǎn)生其實例對象,主要有以下幾種工廠方法:
//只處理時間的轉(zhuǎn)換 public final static DateFormat getTimeInstance() //只處理日期的轉(zhuǎn)換 public final static DateFormat getDateInstance() //既可以處理時間,也可以處理日期 public final static DateFormat getDateTimeInstance()
當(dāng)然,它們各自都有各自的重載方法,具體的我們待會兒看。
DateFormat 有兩類方法,format 和 parse。
public final String format(Date date) public Date parse(String source)
format 方法用于將一個日期對象格式化為字符串,parse 方法用于將一個格式化的字符串裝換為一個日期對象。例如:
public static void main(String[] args){ Calendar calendar = Calendar.getInstance(); DateFormat dateFormat = DateFormat.getDateTimeInstance(); System.out.println(dateFormat.format(calendar.getTime())); }
輸出結(jié)果:
2018-4-21 16:58:09
顯然,使用工廠構(gòu)造的 DateFormat 實例并不能夠自定義輸出格式化內(nèi)容,即輸出的字符串格式是固定的,不能滿足某些情況下的特殊需求。一般我們會直接使用它的一個實現(xiàn)類,SimpleDateFormat。
SimpleDateFormat 允許在構(gòu)造實例的時候傳入一個 pattern 參數(shù),自定義日期字符的輸出格式。例如:
public static void main(String[] args){ DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日"); System.out.println(dateFormat.format(new Date())); }
輸出結(jié)果:
2018年04月21日
其中,
yyyy:年份用四位進(jìn)行輸出
MM:月份用兩位進(jìn)行輸出
dd:兩位表示日信息
HH:兩位來表示小時數(shù)
mm:兩位表示分鐘數(shù)
ss:兩位來表示秒數(shù)
E:表示周幾,如果 Locale 在中國則會輸出 星期x,如果在美國或英國則會輸出英文的星期
a:表示上午或下午
當(dāng)然,對于字符串轉(zhuǎn)日期也是很方便的,允許自定義模式,但必須遵守自己制定的模式,否則程序?qū)o法成功解析。例如:
public static void main(String[] args){ String str = "2018年4月21日 17點17分 星期六"; DateFormat sDateFormat = new SimpleDateFormat("yyyy年M月dd日 HH點mm分 E"); sDateFormat.parse(str); System.out.println(sDateFormat.getCalendar().getTime()); }
輸出結(jié)果:
Sat Apr 21 17:17:00 CST 2018
顯然,程序是正確的解析的我們的字符串并轉(zhuǎn)換為 Calendar 對象存儲在 DateFormat 內(nèi)部的。
到此這篇關(guān)于如何在Java項目中使用時間日期API的文章就介紹到這了,更多相關(guān)如何在Java項目中使用時間日期API的內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持創(chuàng)新互聯(lián)!