千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0

          java中的時(shí)間操作不外乎這四種情況:

          1、獲取當(dāng)前時(shí)間

          2、獲取某個(gè)時(shí)間的某種格式

          3、設(shè)置時(shí)間

          4、時(shí)間的運(yùn)算

          好,下面就針對(duì)這四種情況,一個(gè)一個(gè)搞定。

           

          一、獲取當(dāng)前時(shí)間

           

          有兩種方式可以獲得,第一種,使用Date類。

          j2SE的包里有兩個(gè)Date類,一個(gè)是java.sql.Date,一個(gè)是java.util.Date

          這里,要使用java.util.Date。獲取當(dāng)前時(shí)間的代碼如下

          Date date = new Date();

          date.getTime();

          還有一種方式,使用System.currentTimeMillis();

           

          這兩種方式獲得的結(jié)果是一樣的,都是得到一個(gè)當(dāng)前的時(shí)間的long型的時(shí)間的毫秒值,這個(gè)值實(shí)際上是當(dāng)前時(shí)間值與1970年一月一號(hào)零時(shí)零分零秒相差的毫秒數(shù)。

          當(dāng)前的時(shí)間得到了,但實(shí)際的應(yīng)用中最后往往不是要用這個(gè)long型的東西,用戶希望得到的往往是一個(gè)時(shí)間的字符串,比如“2006618號(hào)”,或“2006-06-18”,老外可能希望得到的是“06-18-2006”,諸如此類等等。這就是下一個(gè)要解決的問(wèn)題

           

          二、獲取某個(gè)時(shí)間的某種格式

           

          獲取時(shí)間的格式,需要用到一個(gè)專門用于時(shí)間格式的類java.text.SimpleDateFormat

          首先,定義一個(gè)SimpleDateFormat變量

          SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);

          這個(gè)構(gòu)造函數(shù)的定義如下:

          SimpleDateFormat(String pattern, Locale locale)

          第一個(gè)參數(shù)pattern,我們后面再解釋,這里我們使用一個(gè)"",第二個(gè)參數(shù),是用來(lái)設(shè)置時(shí)區(qū)的,這里用到了java.util.Locale這個(gè)類,這個(gè)類了面定義了很多靜態(tài)變量,直接拿過(guò)來(lái)用就OK,我們把時(shí)區(qū)設(shè)置為Locale.SIMPLIFIED_CHINESE,只看名字,這個(gè)靜態(tài)變量的意義已經(jīng)很清楚了。

           

          接下來(lái)我們使用這個(gè)SimpleDateFormat把當(dāng)前時(shí)間格式化為一個(gè)如下格式的時(shí)間字符串“XXXXXXXX_XX時(shí)XXXX秒”,代碼:

          sdf.applyPattern("yyyy年MM月dd日_HH時(shí)mm分ss秒");

          String timeStr = sdf.format(new Date());

           

          獲取時(shí)間格式的函數(shù)是format,這個(gè)函數(shù)的參數(shù)是java.util.Date對(duì)象,這個(gè)沒(méi)有什么花頭。

          要說(shuō)明一下的是這個(gè)pattern,所謂的模式。這里,yyyy,MM,dd等,這就是模式。

          我們可以在SimpleDateFormat的構(gòu)造函數(shù)中指定模式,比如

          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);

          也可以獲取時(shí)間格式的時(shí)候使用applyPattern函數(shù)臨時(shí)指定,上面的例子就是這樣。

          什么字符代表什么,這是j2se約定好的,設(shè)置模式的時(shí)候,我們可以使用約定好的字符加上任何我們想要的字符串。

          j2se對(duì)字符所代表的模式的約定列表如下:

           

           

          Letter Date or Time Component Presentation
          G Era designator Text
          y Year Year
          M Month in year Month
          w Week in year Number
          W Week in month Number
          D Day in year Number
          d Day in month Number
          F Day of week in month Number
          E Day in week Text
          a Am/pm marker Text 
          H Hour in day (0-23) Number
          k Hour in day (1-24) Number
          K Hour in am/pm (0-11)  Number
          h   Hour in am/pm (1-12)  Number
          m   Minute in hour  Number
          s   Second in minute  Number
          S   Millisecond  Number  
          z   Time zone   General time zone 
          Z   Time zone  RFC 822 time zone 

          三,設(shè)置時(shí)間

          現(xiàn)在設(shè)置時(shí)間,推薦 使用java.util.Calendar類來(lái)進(jìn)行操作,因?yàn)閖ava.util.Date類很多方法都過(guò)時(shí)了,
          Calendar 類有很多重載的設(shè)置時(shí)間的方法
          我們可以針對(duì)于某一項(xiàng)進(jìn)行設(shè)置,也可以同時(shí)進(jìn)行很多設(shè)置
          void set(int field, int value)
                    將給定的日歷字段設(shè)置為給定值。
           void set(int year, int month, int date)
                    設(shè)置日歷字段 YEARMONTHDAY_OF_MONTH 的值。
           void set(int year, int month, int date, int hourOfDay, int minute)
                    設(shè)置日歷字段 YEARMONTHDAY_OF_MONTHHOUR_OF_DAYMINUTE 的值。
           void set(int year, int month, int date, int hourOfDay, int minute, int second)
                    設(shè)置字段 YEARMONTHDAY_OF_MONTHHOURMINUTESECOND 的值。
          其中第一個(gè)就是給特定的字段設(shè)值,后面三個(gè)就是針對(duì)多個(gè)字段賦值

          四,時(shí)間運(yùn)算

          時(shí)間的運(yùn)算,無(wú)外乎就是加加減減,然后比較誰(shuí)早誰(shuí)晚而已,這些需求JAVA的API已經(jīng)幫我們實(shí)現(xiàn)的很好了。一般比較時(shí)間的可以用如下的方法
          abstract  void add(int field, int amount)
                    根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量。
           boolean after(Object when)
                    判斷此 Calendar 表示的時(shí)間是否在指定 Object 表示的時(shí)間之后,返回判斷結(jié)果。
           boolean before(Object when)
                    判斷此 Calendar 表示的時(shí)間是否在指定 Object 表示的時(shí)間之前,返回判斷結(jié)果。

          第一個(gè)是給某個(gè)字段加上某個(gè)數(shù)量的時(shí)間,雖然這個(gè)方法名叫add ,我們要減也是調(diào)用它的,只不過(guò)我們傳入的是負(fù)數(shù)。

          其實(shí)JAVA對(duì)時(shí)間操作的支持還是挺豐富的。希望大家的日常的使用中有更多的發(fā)現(xiàn)。



          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-09-11 23:56 千里冰封 閱讀(39727) 評(píng)論(14)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: JAVA中的時(shí)間操作
          2007-09-12 08:00 | 久城
          關(guān)于時(shí)間的運(yùn)算,用Calendar或者其子類GregorianCalendar也許更好一些。  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-12 08:38 | 楊愛(ài)友
          獲取、設(shè)置時(shí)間用Date類,關(guān)于對(duì)時(shí)間的比較、計(jì)算用GregorianCaleader及其子類更方便。  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作[未登錄](méi)
          2007-09-12 09:24 | david
          頂一個(gè)  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作[未登錄](méi)
          2007-09-12 09:55 | Samuel
          對(duì)時(shí)間沒(méi)有進(jìn)行徹底的研究,這只是入門而已!  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-12 11:54 | 編程、設(shè)計(jì)是職業(yè)更是愛(ài)好
          在實(shí)際項(xiàng)目中,時(shí)區(qū)會(huì)帶來(lái)很多問(wèn)題  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-12 15:07 | 黑盒子
          很好很好。。一直都在用不同的方法寫時(shí)間,沒(méi)次都是找來(lái)找去,找到一個(gè)能用的。但是沒(méi)有一次自己總結(jié)一下,雖然上面的東西都用過(guò),但是用的時(shí)候,還是要去找。。這個(gè)東西非常號(hào)!! 謝謝~~  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-12 19:39 | 千里冰封
          @黑盒子
          謝謝
          有空常來(lái)坐坐:)  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-13 09:56 | Matthew Chen
          聽說(shuō)java中時(shí)間的操作有一些不是很精確,不清楚具體指哪一塊,樓主有沒(méi)有研究呢,感覺(jué)用calander會(huì)好點(diǎn).  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-13 09:57 | 死循環(huán)
          恩,在實(shí)際開發(fā)中還是用GregorianCalendar和Calendar....
          不過(guò)也時(shí)受教了...  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2007-09-13 09:59 | 千里冰封
          @Matthew Chen
          現(xiàn)在對(duì)時(shí)間的操作JAVA都是推薦使用Calendar的,Date大部份方法都過(guò)時(shí)了,并且Calendar可以處理更多的情況  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2008-12-30 13:19 | 北京時(shí)間
          實(shí)際開發(fā)中還是用GregorianCalendar和Calendar  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2012-06-18 15:19 | ralph
          謝謝,  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2012-09-03 18:37 | Strive443
          好文,好畫,好博客  回復(fù)  更多評(píng)論
            
          # re: JAVA中的時(shí)間操作
          2012-10-26 15:35 | gloot
          java 的時(shí)間真蛋疼,

          設(shè)計(jì)得真他媽的垃圾  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 毕节市| 宁陵县| 恭城| 晋中市| 蒲江县| 静海县| 六盘水市| 罗山县| 读书| 涟水县| 沙湾县| 万荣县| 黄浦区| 望奎县| 中牟县| 遂平县| 孟津县| 莱西市| 祁阳县| 独山县| 青阳县| 古交市| 高雄市| 托克逊县| 三亚市| 云和县| 探索| 上犹县| 洛隆县| 文登市| 泾源县| 修武县| 中西区| 内黄县| 通江县| 鞍山市| 商水县| 剑川县| 大城县| 普兰店市| 鹰潭市|