Java API中關(guān)于日期和時間,有三個主要的類锹引。
? Date:表示時刻筑煮,即絕對時間,與年月日無關(guān)粤蝎。
? Calendar:表示年歷,Calendar是一個抽象類袋马,其中表示公歷的子類是Gregorian-Calendar初澎。
? DateFormat:表示格式化,能夠?qū)⑷掌诤蜁r間與字符串進行相互轉(zhuǎn)換虑凛,DateFormat也是一個抽象類碑宴,其中最常用的子類是SimpleDateFormat。
還有兩個相關(guān)的類:
? TimeZone:表示時區(qū)桑谍。
? Locale:表示國家(或地區(qū))和語言延柠。
Date類
Date中的大部分方法都已經(jīng)過時了,其中沒有過時的主要方法有下面這些:
public long getTime() //返回毫秒數(shù)
public boolean equals(Object obj) //主要就是比較內(nèi)部的毫秒數(shù)是否相同? ? ? ? //與其他Date進行比較锣披,如果當(dāng)前Date的毫秒數(shù)小于參數(shù)中的返回-1贞间,相同返回0,否則返回1
public int compareTo(Date anotherDate)
public boolean before(Date when) //判斷是否在給定日期之前
public boolean after(Date when) //判斷是否在給定日期之后
public int hashCode() //哈希值算法與Long類似
TimeZone類
TimeZone表示時區(qū)雹仿,是一個抽象類增热,有靜態(tài)方法可以獲取實例,過去當(dāng)前的默認時區(qū):
TimeZone.getDefault();
可以在啟動java時修改時區(qū)
java -Duser.timezone=Asia/Shanghai xxxx
TimeZone也有靜態(tài)方法胧辽,可以獲得任意給定時區(qū)的實例峻仇。比如,獲取美國東部時區(qū):
? ? ? ? TimeZone tz = TimeZone.getTimeZone("US/Eastern");
ID除了可以是名稱外邑商,還可以是GMT形式表示的時區(qū)摄咆,如:
? ? ? ? TimeZone tz = TimeZone.getTimeZone("GMT+08:00");
Locale
表示國家凡蚜,地區(qū)和語言
Locale類中定義了一些靜態(tài)變量,表示常見的Locale吭从,比如:
? Locale.US:表示美國英語朝蜘。
? Locale.ENGLISH:表示所有英語。
? Locale.TAIWAN:表示中國臺灣地區(qū)所用的中文影锈。
? Locale.CHINESE:表示所有中文芹务。
? Locale.SIMPLIFIED_CHINESE:表示中國內(nèi)地所用的中文。
與TimeZone類似鸭廷,Locale也有靜態(tài)方法獲取默認值枣抱,如:
? ? ? ? Locale locale = Locale.getDefault();? ? ? ? System.out.println(locale.toString()); //zh_CN
Calendar
Calendar類是日期和時間操作中的主要類,它表示與TimeZone和Locale相關(guān)的日歷信息辆床,可以進行各種相關(guān)的運算佳晶。
Calendar中的一些靜態(tài)變量
? Calendar.YEAR:表示年。
? Calendar.MONTH:表示月讼载,1月是0, Calendar同樣定義了表示各個月份的靜態(tài)變量轿秧,如Calendar.JULY表示7月荣赶。
? Calendar.DAY_OF_MONTH:表示日扯饶,每月的第一天是1寄雀。
? Calendar.HOUR_OF_DAY:表示小時毁兆,為0~23侣滩。
? Calendar.MINUTE:表示分鐘绒瘦,為0~59膊毁。
? Calendar.SECOND:表示秒精堕,為0~59凸克。
? Calendar.MILLISECOND:表示毫秒议蟆,為0~999。
? Calendar.DAY_OF_WEEK:表示星期幾萎战,周日是1咐容,周一是2,周六是7, Calenar同樣定義了表示各個星期的靜態(tài)變量蚂维,如Calendar.SUNDAY表示周日戳粒。
與new Date()類似,新創(chuàng)建的Calendar對象表示的也是當(dāng)前時間虫啥,與Date不同的是享郊, Calendar對象可以方便地獲取年月日等日歷信息。來看代碼孝鹊,輸出當(dāng)前時間的各種信息:
? ? ? ? Calendar calendar = Calendar.getInstance();? ? ? ? System.out.println("year: "+calendar.get(Calendar.YEAR));? ? ? ? System.out.println("month: "+calendar.get(Calendar.MONTH));? ? ? ? System.out.println("day: "+calendar.get(Calendar.DAY_OF_MONTH));? ? ? ? System.out.println("hour: "+calendar.get(Calendar.HOUR_OF_DAY));? ? ? ? System.out.println("minute: "+calendar.get(Calendar.MINUTE));? ? ? ? System.out.println("second: "+calendar.get(Calendar.SECOND));? ? ? ? System.out.println("millisecond: " +calendar.get(Calendar.MILLISECOND));? ? ? ? System.out.println("day_of_week: " + calendar.get(Calendar.DAY_OF_WEEK));
具體輸出與執(zhí)行時的時間和默認的TimeZone以及Locale有關(guān)炊琉,比如,在筆者的計算機中的一次輸出為:
year: 2016? ? ? ?
month: 7? ? ? ?
day: 14? ? ? ?
hour: 13? ? ? ?
minute: 55? ? ? ?
second: 51? ? ? ?
millisecond: 564? ? ? ?
day_of_week: 2
Calendar支持根據(jù)Date或毫秒數(shù)設(shè)置時間:
? ? ? ? public final void setTime(Date date)? ? ? ? public void setTimeInMillis(long millis)
也支持根據(jù)年月日等日歷字段設(shè)置時間,比如:
? ? ? ? public final void set(int year, int month, int date)? ? ? ? public final void set(int year, int month, int date,? ? ? ? ? int hourOfDay, int minute, int second)? ? ? ? public void set(int field, int value)
除了直接設(shè)置苔咪,Calendar支持根據(jù)字段增加和減少時間:
? ? ? ? public void add(int field, int amount)
amount為正數(shù)表示增加锰悼,負數(shù)表示減少。
比如团赏,如果想設(shè)置Calendar為第二天的下午2點15箕般,代碼可以為:
? ? ? ? Calendar calendar = Calendar.getInstance();? ? ? ? calendar.add(Calendar.DAY_OF_MONTH, 1);? ? ? ? calendar.set(Calendar.HOUR_OF_DAY, 14);? ? ? ? calendar.set(Calendar.MINUTE, 15);? ? ? ? calendar.set(Calendar.SECOND, 0);? ? ? ? calendar.set(Calendar.MILLISECOND, 0);
Calendar可以方便地轉(zhuǎn)換為Date或毫秒數(shù),方法是:
? ? ? ? public final Date getTime()? ? ? ? public long getTimeInMillis()
Dateformat
DateFormat類主要在Date和字符串表示之間進行相互轉(zhuǎn)換舔清,它有兩個主要的方法:
public final String format(Date date)? ? ? ? public Date parse(String source)
format將Date轉(zhuǎn)換為字符串丝里,parse將字符串轉(zhuǎn)換為Date。
SimpleDateFormat是DateFormat的子類体谒,相比DateFormat杯聚,它的一個主要不同是,它可以接受一個自定義的模式(pattern)作為參數(shù)抒痒,這個模式規(guī)定了Date的字符串形式幌绍。先看個例子:
? ? ? ? Calendar calendar = Calendar.getInstance();? ? ? ? //2016-08-15 14:15:20? ? ? ? calendar.set(2016, 07, 15, 14, 15, 20);? ? ? ? SimpleDateFormat sdf = new SimpleDateFormat(? ? ? ? ? ? "yyyy年MM月dd日 E HH時mm分ss秒");? ? ? ? System.out.println(sdf.format(calendar.getTime()));
輸出為:
? ? ? ? 2016年08月15日 星期一 14時15分20秒
? yyyy:表示4位的年。
? MM:表示月故响,用兩位數(shù)表示傀广。
? dd:表示日,用兩位數(shù)表示彩届。
? HH:表示24小時制的小時數(shù)伪冰,用兩位數(shù)表示。
? mm:表示分鐘樟蠕,用兩位數(shù)表示贮聂。
? ss:表示秒,用兩位數(shù)表示坯墨。
? E:表示星期幾。