1. 程式人生 > >java 中calendar常見用法

java 中calendar常見用法

    有空整理一下之前的東西,因為最近用到了calendar這個類,故做了一些整理.

1.時區和地區的差異

目前比較常用的是GMT和UTC,GMT官方叫做格林尼治時間,也是目前格林尼治天文臺的官方時間,世界都比較認可的,UMT也叫世界協調時,是在 GMT基礎上作了一些修改,前後差異不大。

地區的差異主要反映在中國普遍以禮拜一作為一個禮拜的開始,西方是以禮拜天作為一個禮拜的開始(這也解釋了為什麼Calendar.DAY_OF_WEEK返回的時間總是跟我們想要的差了那麼一點,比如返回1,其實是禮拜天,而不是我們想象的禮拜一

2.Calendar物件的獲取

方法一:  Calendar cal=Calendar.getInstance() 該方法常用,直接獲取了calendar的一個例項,返回的是當前的時間.

java8中的原始碼這麼記錄:

    /**
     * Gets a calendar using the default time zone and locale. The
     * <code>Calendar</code> returned is based on the current time
     * in the default time zone with the default locale.
     *
     * @return a Calendar.
     */
    public static Calendar getInstance()
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
        cal.sharedZone = true;
        return cal;
    }

調取的就是這個靜態方法,返回的是一個Calendar物件.

方法二:   Calendar cal= new GregorianCalendar();該方法相對用的少

摘自原始碼中的程式碼:

*
 * @see          TimeZone
 * @author David Goldsmith, Mark Davis, Chen-Lieh Huang, Alan Liu
 * @since JDK1.1
 */
public class GregorianCalendar extends Calendar {
    /*
     * Implementation Notes
     *

很明顯,GregorianCalendar是Calendar的一個子類

3.通過Calendar設定時間

方法: void set(int field,int value);

  public static String getTimeByCalendar(){
    Calendar cal=Calendar.getInstance();
    cal.set(Calendar.YEAR,2005);
cal.set(Calendar.MONTH,7);
cal.set(Calendar.DAY_OF_MONTH,12);
cal.set(Calendar.HOUR_OF_DAY,15);
cal.set(Calendar.MINUTE,23);
cal.set(Calendar.SECOND,45);
Date date=cal.getTime();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=format.format(date);
return time;
    }

這裡需要解釋一下: DAY_OF_MONTH:月中的天,也就是幾號;

                                 DAY_OF_WEEK:星期中的天,相當於禮拜幾;

                                 DAY_OF_YREA:一年中的第幾天

                                 HOUR_OF_DAY:此處需要注意的是get獲取的是24小時制的時間值

                                此處的MONTH需要注意的是從0開始,我這邊寫的是7,其實是八月份。

                               其他的類推。

4.通過Calendar獲取時間

方法: int get(int field):該方法可以獲取Calendar中給定的時間分量對應的值

Calendar cal=Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY,0);
    cal.set(Calendar.MINUTE,0);
    cal.set(Calendar.SECOND,0);
    System.out.println(cal.get(Calendar.HOUR_OF_DAY));

5通過Calendar修改時間值(往前或者往後推算)

方法: void add(int field,int value):當前的calendar加上給定的時間分量對應的值

   Calendar calendar=Calendar.getInstance();
      
      calendar.add(Calendar.DAY_OF_MONTH,5);
      calendar.set(Calendar.MONTH,0);

此處需要注意的是,value的值正負決定是往前還是往後,這個自己可以測試一下

此處還有另外一方法: void roll(int field,int value):主要功能和add差不多,但是兩者的差別還是有的:

程式碼如下:

 public static void main(String[] args) {

      Calendar calendar=Calendar.getInstance();
      calendar.set(Calendar.MONTH,0);
      calendar.roll(Calendar.MONTH,-1);
     System.out.println(convertDateToString(calendar.getTime()));

}

     public static String convertDateToString(Date date){
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String time=format.format(date);
    return time;
    }

輸出的是:2017-12-27 01:42:36,是不是有點不對,我想要的時間應該是2016-12-27 01:42:36,

可見roll它只會變更當前位置的時間值,不會借位進行對應的加減

我們換成add試試看:

public static void main(String[] args) {

      Calendar calendar=Calendar.getInstance();
      calendar.set(Calendar.MONTH,0);
     calendar.add(Calendar.MONTH,-1);
     System.out.println(convertDateToString(calendar.getTime()));

}

     public static String convertDateToString(Date date){
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String time=format.format(date);
    return time;
    }

輸出的是:2016-12-27 01:42:36

ok,這個才是對的。

6.Calendar與Date之間的轉換:

Calendar轉換成Date

Calendar calendar=Calendar.getInstance();

Date  date=calendar.getTime()

Date 轉換成 Calendar 

Calendar calendar=Calendar.getInstance();

Date date=new Date();

calendar.setTime(date);

ok!!!!    暫時總結到此吧!!!  溫故而知新,可以為師矣!