java時間類Date、Calendar及用法


  對於時間類,這篇主要說明各種現實情況下如何取值,怎么定向取值,得到自己想要的時間參數。在java中時間類主要有DateCalendar,暫時只介紹 java.util.*下的時間類,對於java.sql.*下的先不做介紹,以后在另外一篇進行補充,這篇主要內容有以下幾個。

         1、如何獲取當前時間參數

         2、如何過去某一個月第一天和最后一天 

         3、如何獲取當日日期,當月月份,當年年份

         4、如何加減日期

         5、獲取兩個時間之間的時間差

  首先,我們需要了解API下對其的介紹,讓在使用的時候明白為什么這么寫?而不是簡單的復制粘貼應付差事。

  對於Date,很多方法已經過時遷移到了Calendar類上,但是這是最初的時間類,構造方法主要介紹兩種即

    Date date= new Date();//分配對象並初始話

    Date date= new Date(long date)//分配 Date 對象並初始化此對象,以表示自從標准基准時間(稱為“歷元(epoch)”,即 1970 年 1 月 1 日00:00:00 GMT)以來的指定毫秒數。

  可以看得出來,Date是以歷元為標准的,簡單的驗證下你的猜想。new Date().getYear() 的值是  117 然而今年是 2017 。

  對於Calendar,與Date不同的是,他對Date的時間歷元進行偏移,要是看括號里的有點暈可不看。API(Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEARMONTHDAY_OF_MONTHHOUR日歷字段之間的轉換提供了一些方法,並為操作日歷字段(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距歷元(即格林威治標准時間 1970 年 1 月 1 日的 00:00:00.000,格里高利歷)的偏移量)。

  Calendar不得不說的就是類方法 getInstance,CalendargetInstance 方法返回一個 Calendar 對象,其日歷字段已由當前日期和時間初始化:這個方法你必須要知道,不然你玩什么Calendar呢是不是? 

              Calendar rightNow = Calendar.getInstance();

  好了下面我們介紹各種現實需要處理的,也肯定是你進入博客要找的。


     在介紹以下的內容前,我們先說明下也不得不說的一個類SimpleDateFormat,其屬於java.text.*下,SimpleDateFormat 是一個以語言環境有關的方式來格式化和解析日期的具體類,它允許進行格式化(日期-->文本)、解析(文本-->日期)和規范化。下面很多方法都出現了這個類的應運,簡單說一下掃除心中的疑惑,抽空可以看一下API。

    

    1、如何過去當錢時間參數。yyyy-MM-dd hh:mm:ss 、yyyy-MM-dd、yyyy-MM-dd hh:mm 、yyyyMMdd等等各種情況,這個你們需要什么自己改代碼。

1         public static String getCurrentTime() { 2           Date NowDate = new Date(); 3           SimpleDateFormat formatter =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 4           CurrentTime = formatter.format(NowDate); 5           return CurrentTime; 6    }

   

    2、何獲取某一個月的第一天和最后一天。

    第一天肯定容易,最后一天其實也很容易,主要用到了Calendar和SimpleDateFormat兩個類,需要注意的是月份按0---11總共十二個月,不是從1開始的,但是一個月幾號第幾天卻是從1開始的,以下是對兩個方法進行的封裝。

 1     public static String getLastDayOfMonth(int year, int month) {  2           Calendar cal = Calendar.getInstance();  3    cal.set(Calendar.YEAR, year);  4    cal.set(Calendar.MONTH, month);  5    cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DATE));  6          return  new   SimpleDateFormat( "yyyy-MM-dd ").format(cal.getTime());  7    }  8       public static String getFirstDayOfMonth(int year, int month) {  9           Calendar cal = Calendar.getInstance(); 10    cal.set(Calendar.YEAR, year); 11     cal.set(Calendar.MONTH, month); 12    cal.set(Calendar.DAY_OF_MONTH,cal.getMinimum(Calendar.DATE)); 13          return   new   SimpleDateFormat( "yyyy-MM-dd ").format(cal.getTime()); 14       }

    

    

    3、如何獲取當月月份,當年年份,當前日期?較為簡單不做測試。在這個方法上你可以測試下當傳yyyy-MM-dd等等各種參數,變通應用獲取時間參,比如獲取2017-09、201709、2017-09-22、20170922等等各種數據,有興趣的話自己進行測試下驗證下自己的想法。

 1       /**
 2       * @param type類型 
 3       * dd 日 MM 月 yyyy 年 按需要進行傳參
 4       * @return
 5       */
 6       public static String getCurrentDay(String type) {
 7         java.util.Date NowDate = new java.util.Date();
 8         SimpleDateFormat formatter = new SimpleDateFormat(type);
 9         return formatter.format(NowDate);
10       }

    4、如何加減日期?Calendar類中提供了add方法,按需要進行操作想要的結果哦!

    這里簡單的介紹下add方法,即add(f, delta)將 delta 添加到 f 字段中,主要有兩個規則:

Add 規則 1。調用后 f 字段的值減去調用前 f 字段的值等於 delta,以字段 f 中發生的任何溢出為模。溢出發生在字段值超出其范圍時,結果,下一個更大的字段會遞增或遞減,並將字段值調整回其范圍內。

Add 規則 2。如果期望某一個更小的字段是不變的,但讓它等於以前的值是不可能的,因為在字段 f 發生更改之后,或者在出現其他約束之后,比如時區偏移量發生更改,它的最大值和最小值也在發生更改,然后它的值被調整為盡量接近於所期望的值。更小的字段表示一個更小的時間單元。HOUR 是一個比 DAY_OF_MONTH 小的字段。對於不期望是不變字段的更小字段,無需進行任何調整。日歷系統會確定期望不變的那些字段。

  廢話太多直接弄代碼!給個標記,現在的時間是2017-09-21,需要注意的是 向后推一天是 +1 向前是 -1,下面代碼的測試結果為2017-09-22   

1        Calendar c = Calendar.getInstance();
2           c.add(Calendar.DAY_OF_MONTH, +1);
3           Date d = c.getTime();
4           System.out.println(new   SimpleDateFormat( "yyyy-MM-dd ").format(d)); 

    5、獲取兩個時間之間的時間差

    有時候需要獲取兩個時間的時間差,下面的方法主要用到了SimpleDateFormatMath兩個類,直接放代碼吧!

 1 /**
 2      * 獲取時間差
 3      * @param time1 time2 需要計算的時間
 4      * @return
 5      */
 6     public static String getTimeDeffer(String time1,String time2)
 7     {
 8         String result = "";
 9         if(StringUtils.isNotBlank(time1)&&StringUtils.isNotBlank(time2)){
10             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
11             try {
12                 long dt1 = sdf.parse( time1 ).getTime();
13                 long dt2 = sdf.parse( time2 ).getTime();
14                 long dc = Math.abs(dt2-dt1);
16                 long seconds = dc/1000;   
17                 long date = seconds/(24*60*60);     //相差的天數   
18                 long hour = (seconds-date*24*60*60)/(60*60);//相差的小時數   
19                 long minut = (seconds-date*24*60*60-hour*60*60)/(60);//相差的分鍾數
20                 long second = (seconds-date*24*60*60-hour*60*60-minut*60);//相差的秒數   
21                 return (date==0?"":(date+"天"))+(hour==0?"":(hour+"小時"))+(minut==0?"":(minut+"分"))+(second==0?"":(second+"秒"));
22             } catch (ParseException e) {
23                 e.printStackTrace();
24             }
25         }
26         return result;        
27     }

   這里我們簡單的測試下,就不放圖了,簡單的說一下,例如:

  System.out.println(getTimeDeffer("2015-10-21 10:48:22","2015-10-27 22:48:23"));

  結果是:6天12小時1秒


 

  休息下班,明天繼續

  希望大家能積極發表自己的看法和建議,支持下哦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM