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;
}
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!!!! 暫時總結到此吧!!! 溫故而知新,可以為師矣!