一、Java中的日期概述<br />日期在Java中是一塊非常複雜的內容,對於一個日期在不同的語言國別環境中,日期的國際化,日期和時間之間的轉換,日期的加減運算,日期的展示格式都是非常複雜的問題。
在Java中,操作日期主要涉及到一下幾個類:
1、java.util.Date
類Date 表示特定的瞬間,精確到毫秒。從JDK 1.1 開始,應該使用Calendar 類實現日期和時間字段之間轉換,使用DateFormat 類來格式化和分析日期字符串。 Date 中的把日期解釋為年、月、日、小時、分鐘和秒值的方法已廢棄。
2、java.text.DateFormat(抽像類)
DateFormat 是日期/時間格式化子類的抽像類,它以與語言無關的方式格式化並分析日期或時間。日期/時間格式化子類(如SimpleDateFormat)允許進行格式化(也就是日期-> 文本)、分析(文本-> 日期)和標準化。將日期表示為Date 對象,或者表示為從GMT(格林尼治標準時間)1970 年,1 月1 日00:00:00 這一刻開始的毫秒數。
3、java.text.SimpleDateFormat(DateFormat的直接子類)
SimpleDateFormat 是一個以與語言環境相關的方式來格式化和分析日期的具體類。它允許進行格式化(日期-> 文本)、分析(文本-> 日期)和規範化。
SimpleDateFormat 使得可以選擇任何用戶定義的日期-時間格式的模式。但是,仍然建議通過DateFormat 中的getTimeInstance、getDateInstance 或getDateTimeInstance 來新的創建日期-時間格式化程序。
4、java.util.Calendar(抽像類)
Calendar 類是一個抽像類,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH、HOUR 等日曆字段之間的轉換提供了一些方法,並為操作日曆字段(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間1970 年1 月1 日的00:00:00.000,格里高利歷)的偏移量。
與其他語言環境敏感類一樣,Calendar 提供了一個類方法getInstance,以獲得此類型的一個通用的對象。 Calendar 的getInstance 方法返回一個Calendar 對象,其日曆字段已由當前日期和時間初始化。
5、java.util.GregorianCalendar(Calendar的直接子類)
GregorianCalendar 是Calendar 的一個具體子類,提供了世界上大多數國家使用的標準日曆系統。
GregorianCalendar 是一種混合日曆,在單一間斷性的支持下同時支持儒略歷和格里高利歷系統,在默認情況下,它對應格里高利日曆創立時的格里高利曆日期(某些國家是在1582 年10 月15 日創立,在其他國家要晚一些)。可由調用方通過調用setGregorianChange() 來更改起始日期。
二、java.util.Date的使用
1、java.util.Date的API簡介
類java.util.Date 表示特定的瞬間,精確到毫秒。提供了很多的方法,但是很多已經過時,不推薦使用,下面僅僅列出沒有過時的方法:
構造方法摘要
-------------
Date()
分配Date 對象並用當前時間初始化此對象,以表示分配它的時間(精確到毫秒)。
Date(long date)
分配Date 對象並初始化此對象,以表示自從標準基準時間(稱為“曆元(epoch)”,即1970 年1 月1 日00:00:00 GMT)以來的指定毫秒數。
方法摘要
-------------
boolean after(Date when)
測試此日期是否在指定日期之後。
boolean before(Date when)
測試此日期是否在指定日期之前。
Object clone()
返回此對象的副本。
int compareTo(Date anotherDate)
比較兩個日期的順序。
boolean equals(Object obj)
比較兩個日期的相等性。
long getTime()
返回自1970 年1 月1 日00:00:00 GMT 以來此Date 對象表示的毫秒數。
int hashCode()
返回此對象的哈希碼值。
void setTime(long time)
設置此Date 對象,以表示1970 年1 月1 日00:00:00 GMT 以後time 毫秒的時間點。
String toString()
把此Date 對象轉換為以下形式的String: dow mon dd hh:mm:ss zzz yyyy 其中:
dow 是一周中的某一天(Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
mon 是月份(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。
dd 是一月中的某一天(01 至31),顯示為兩位十進制數。
hh 是一天中的小時(00 至23),顯示為兩位十進制數。
mm 是小時中的分鐘(00 至59),顯示為兩位十進制數。
ss 是分鐘中的秒數(00 至61),顯示為兩位十進制數。
zzz 是時區(並可以反映夏令時)。標準時區縮寫包括方法parse 識別的時區縮寫。如果不提供時區信息,則zzz 為空,即根本不包括任何字符。
yyyy 是年份,顯示為4 位十進制數。
下面是一個Date類的綜合實例:
public class TestDate { public static void main(String[] args) { TestDate testdate = new TestDate(); testdate.getSystemCurrentTime(); testdate.getCurrentDate(); } /** * 獲取系統當前時間* System.currentTimeMillis()返回系統當前時間,結果為1970年1月1日0時0分0秒開始,到程序執行取得系統時間為止所經過的毫秒數* 1秒=1000毫秒*/ public void getSystemCurrentTime(){ System.out.println("---獲取系統當前時間---"); System.out.println(System.currentTimeMillis()); } public void getCurrentDate(){ System.out.println("---獲取系統當前時間---"); //創建並初始化一個日期(初始值為當前日期) Date date = new Date(); System.out.println("現在的日期是= " + date.toString()); System.out.println("自1970年1月1日0時0分0秒開始至今所經歷的毫秒數= " + date.getTime()); }} 2、java.text.DateFormat抽像類的使用
DateFormat 是日期/時間格式化子類的抽像類,它以與語言無關的方式格式化並分析日期或時間。日期/時間格式化子類(如SimpleDateFormat)允許進行格式化(也就是日期-> 文本)、分析(文本-> 日期)和標準化。將日期表示為Date 對象,或者表示為從GMT(格林尼治標準時間)1970 年,1 月1 日00:00:00 這一刻開始的毫秒數。
DateFormat 提供了很多類方法,以獲得基於默認或給定語言環境和多種格式化風格的默認日期/時間Formatter。格式化風格包括FULL、LONG、MEDIUM 和SHORT。方法描述中提供了使用這些風格的更多細節和示例。
DateFormat 可幫助進行格式化並分析任何語言環境的日期。對於月、星期,甚至日曆格式(陰曆和陽曆),其代碼可完全與語言環境的約定無關。
要格式化一個當前語言環境下的日期,可使用某個靜態工廠方法:
myString = DateFormat.getDateInstance().format(myDate);
如果格式化多個日期,那麼獲得該格式並多次使用它是更為高效的做法,這樣系統就不必多次獲取有關環境語言和國家約定的信息了。
DateFormat df = DateFormat.getDateInstance(); for (int i = 0; i < myDate.length; ++i) { output.println(df.format(myDate[i]) + "; "); }
要格式化不同語言環境的日期,可在getDateInstance() 的調用中指定它。
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
還可使用DateFormat 進行分析。
myDate = df.parse(myString);
使用getDateInstance 來獲得該國家的標準日期格式。另外還提供了一些其他靜態工廠方法。使用getTimeInstance 可獲得該國家的時間格式。使用getDateTimeInstance 可獲得日期和時間格式。可以將不同選項傳入這些工廠方法,以控制結果的長度(從SHORT 到MEDIUM 到LONG 再到FULL)。確切的結果取決於語言環境,但是通常:
SHORT 完全為數字,如12.13.52 或3:30pm
MEDIUM 較長,如Jan 12, 1952
LONG 更長,如January 12, 1952 或3:30:32pm
FULL 是完全指定,如Tuesday, April 12, 1952 AD 或3:30:42pm PST。
如果願意,還可以在格式上設置時區。如果想對格式化或分析施加更多的控制(或者給予用戶更多的控制),可以嘗試將從工廠方法所獲得的DateFormat 強制轉換為SimpleDateFormat。這適用於大多數國家;只是要記住將其放入一個try 代碼塊中,以防遇到特殊的格式。
還可以使用借助ParsePosition 和FieldPosition 的分析和格式化方法形式來:逐步地分析字符串的各部分。 對齊任意特定的字段,或者找出字符串在屏幕上的選擇位置。
DateFormat 不是同步的。建議為每個線程創建獨立的格式實例。如果多個線程同時訪問一個格式,則它必須保持外部同步。
3、java.text.SimpleDateFormat(DateFormat的直接子類)的使用
SimpleDateFormat 是一個以與語言環境相關的方式來格式化和分析日期的具體類。它允許進行格式化(日期-> 文本)、分析(文本-> 日期)和規範化。
SimpleDateFormat 使得可以選擇任何用戶定義的日期-時間格式的模式。但是,仍然建議通過DateFormat 中的getTimeInstance、getDateInstance 或getDateTimeInstance 來新的創建日期-時間格式化程序。每一個這樣的類方法都能夠返回一個以默認格式模式初始化的日期/時間格式化程序。可以根據需要使用applyPattern 方法來修改格式模式。有關使用這些方法的更多信息,請參閱DateFormat。
日期和時間模式
日期和時間格式由日期和時間模式字符串指定。在日期和時間模式字符串中,未加引號的字母'A' 到'Z' 和'a' 到'z' 被解釋為模式字母,用來表示日期或時間字符串元素。文本可以使用單引號(') 引起來,以免進行解釋。 "''" 表示單引號。所有其他字符均不解釋;只是在格式化時將它們簡單複製到輸出字符串,或者在分析時與輸入字符串進行匹配。
更多的參考信息可以查看JDK API文檔,下面給出一個綜合實例:
public class TestDateFormat { public static void main(String[] args) throws ParseException { TestDateFormat tdf = new TestDateFormat(); tdf.dateFormat(); } /** * 對SimpleDateFormat類進行測試* @throws ParseException */ public void dateFormat() throws ParseException{ //創建日期Date date = new Date(); //創建不同的日期格式DateFormat df1 = DateFormat.getInstance(); DateFormat df2 = new SimpleDateFormat("yyyy-MM-01 hh:mm:ss EE"); DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); //產生一個指定國家指定長度的日期格式,長度不同,顯示的日期完整性也不同DateFormat df4 = new SimpleDateFormat("yyyy年MM月dd日hh時mm分ss秒EE", Locale.CHINA); DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US); DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd"); //將日期按照不同格式進行輸出System.out.println("-------將日期按照不同格式進行輸出------"); System.out.println("按照Java默認的日期格式,默認的區域: " + df1.format(date)); System.out.println("按照指定格式yyyy-MM-dd hh:mm:ss EE ,系統默認區域:" + df2.format(date)); System.out.println("按照日期的FULL模式,區域設置為中文: " + df3.format(date)); System.out.println("按照指定格式yyyy年MM月dd日hh時mm分ss秒EE ,區域為中文: " + df4.format(date)); System.out.println("按照指定格式yyyy-MM-dd hh:mm:ss EE ,區域為美國: " + df5.format(date)); System.out.println("按照指定格式yyyy-MM-dd ,系統默認區域: " + df6.format(date)); //將符合該格式的字符串轉換為日期,若格式不相配,則會出錯Date date1 = df1.parse("16-01-24 下午2:32"); Date date2 = df2.parse("2016-01-24 02:51:07 星期日"); Date date3 = df3.parse("2016年01月24日星期五"); Date date4 = df4.parse("2016年01月24日02時51分18秒星期日"); Date date5 = df5.parse("2016-01-24 02:51:18 Sunday"); Date date6 = df6.parse("2016-01-24"); System.out.println("-------輸出將字符串轉換為日期的結果------"); System.out.println(date1); System.out.println(date2); System.out.println(date3); System.out.println(date4); System.out.println(date5); System.out.println(date6); }} 4、java.util.Calendar(抽像類)
java.util.Calendar是個抽像類,是系統時間的抽象表示,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH、HOUR 等日曆字段之間的轉換提供了一些方法,並為操作日曆字段(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間1970 年1 月1 日的00:00:00.000,格里高利歷)的偏移量。
與其他語言環境敏感類一樣,Calendar 提供了一個類方法getInstance,以獲得此類型的一個通用的對象。 Calendar 的getInstance 方法返回一個Calendar 對象,其日曆字段已由當前日期和時間初始化。
一個Calendar的實例是系統時間的抽象表示,從Calendar的實例可以知道年月日星期月份時區等信息。 Calendar類中有一個靜態方法get(int x),通過這個方法可以獲取到相關實例的一些值(年月日星期月份等)信息。參數x是一個產量值,在Calendar中有定義。
Calendar中些陷阱,很容易掉下去:
1、Calendar的星期是從周日開始的,常量值為0。
2、Calendar的月份是從一月開始的,常量值為0。
3、Calendar的每個月的第一天值為1。
5、java.util.GregorianCalendar(Calendar的直接子類)
GregorianCalendar 是Calendar 的一個具體子類,提供了世界上大多數國家使用的標準日曆系統。結合Calendar抽像類使用。
下面給出一個綜合實例看看Calendar類的用法:
public class TestCalendar { public static void main(String[] args) throws ParseException { TestCalendar testCalendar = new TestCalendar(); testCalendar.testCalendar(); testCalendar.testCalendar2(); } public void testCalendar(){ //創建Calendar的方式Calendar now1 = Calendar.getInstance(); Calendar now2 = new GregorianCalendar(); Calendar now3 = new GregorianCalendar(2016, 01, 24); Calendar now4 = new GregorianCalendar(2016, 01, 24, 15, 55); //陷阱:Calendar的月份是0~11 Calendar now5 = new GregorianCalendar(2016, 01, 24, 15, 55, 44); Calendar now6 = new GregorianCalendar(Locale.US); Calendar now7 = new GregorianCalendar(TimeZone.getTimeZone("GMT-8:00")); //通過日期和毫秒數設置Calendar now2.setTime(new Date()); System.out.println(now2); now2.setTimeInMillis(new Date().getTime()); System.out.println(now2); //定義日期的中文輸出格式,並輸出日期SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日hh時mm分ss秒E", Locale.CHINA); System.out.println("獲取日期中文格式化化輸出:" + df.format(now5.getTime())); System.out.println(); System.out.println("--------通過Calendar獲取日期中年月日等相關信息--------"); System.out.println("獲取年:" + now5.get(Calendar.YEAR)); System.out.println("獲取月(月份是從0開始的):" + now5.get(Calendar.MONTH)); System.out.println("獲取日:" + now5.get(Calendar.DAY_OF_MONTH)); System.out.println("獲取時:" + now5.get(Calendar.HOUR)); System.out.println("獲取分:" + now5.get(Calendar.MINUTE)); System.out.println("獲取秒:" + now5.get(Calendar.SECOND)); System.out.println("獲取上午、下午:" + now5.get(Calendar.AM_PM)); System.out.println("獲取星期數值(星期是從周日開始的):" + now5.get(Calendar.DAY_OF_WEEK)); System.out.println(); System.out.println("---------通用星期中文化轉換---------"); String dayOfWeek[] = {"", "日", "一", "二", "三", "四", "五", "六"}; System.out.println("now5對象的星期是:" + dayOfWeek[now5.get(Calendar.DAY_OF_WEEK)]); System.out.println(); System.out.println("---------通用月份中文化轉換---------"); String months[] = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"}; System.out.println("now5對象的月份是: " + months[now5.get(Calendar.MONTH)]); } public void testCalendar2() throws ParseException{ //獲取當前月份的最大天數Calendar cal = Calendar.getInstance(); int maxday=cal.getActualMaximum(Calendar.DAY_OF_MONTH); int minday=cal.getActualMinimum(Calendar.DAY_OF_MONTH); System.out.println(maxday); //取當月的最後一天DateFormat formatter3=new SimpleDateFormat("yyyy-MM-"+maxday); System.out.println(formatter3.format(cal.getTime())); //取當月的最後一天DateFormat formatter4=new SimpleDateFormat("yyyy-MM-"+minday); System.out.println(formatter4.format(cal.getTime())); //求兩個日期之間相隔的天數java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd"); java.util.Date beginDate= format.parse("2007-12-24"); java.util.Date endDate= format.parse("2007-12-25"); long day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000); System.out.println("相隔的天數="+day); //一年前的日期java.text.Format formatter5=new java.text.SimpleDateFormat("yyyy-MM-dd"); java.util.Date todayDate=new java.util.Date(); long beforeTime=(todayDate.getTime()/1000)-60*60*24*365; todayDate.setTime(beforeTime*1000); String beforeDate=formatter5.format(todayDate); System.out.println(beforeDate); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, -1); System.out.println(formatter5.format(calendar.getTime())); //當前星期的星期一和星期日SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); GregorianCalendar gregorianCalendar = new GregorianCalendar(); int dayInWeek = gregorianCalendar.get(Calendar.DAY_OF_WEEK); int offset = 0; if (dayInWeek == 1) { // 星期天offset = 6; } else { // 星期一至星期六offset = dayInWeek - 2; } gregorianCalendar.add(GregorianCalendar.DAY_OF_MONTH, -offset); String sday = dateFormat.format(gregorianCalendar.getTime()); gregorianCalendar.add(GregorianCalendar.DAY_OF_MONTH, 6); String eday = dateFormat.format(gregorianCalendar.getTime()); System.out.println("這個星期的星期一:" + sday); System.out.println("這個星期的星期天:" + eday); } }三、總結
Java中日期的經常有一下五個方面:
1、創建日期
2、日期格式化顯示
3、日期的轉換(主要是和字符串之間的相互轉換)
4、日期中年、月、日、時、分、秒、星期、月份等獲取。
5、日期的大小比較、日期的加減。
以上就是為大家總結的java日期時間使用方法,希望對大家的學習有所幫助。