我們經常會涉及到對時間的處理,例如登陸網站,我們會看到網站首頁顯示XXX,歡迎您!今天是XXXX年。。。。某些網站會記錄下用戶登陸的時間,比如銀行的一些網站,對於這些經常需要處理的問題,Java中提供了Calendar這個專門用於對日期進行操作的類,那么這個類有什么特殊的地方呢,首先我們來看Calendar的聲明
public abstract class Calendar extends Objectimplements Serializable, Cloneable, Comparable<Calendar>
該類被abstract所修飾,說明不能通過new的方式來獲得實例,對此,Calendar提供了一個類方法getInstance,以獲得此類型的一個通用的對象,getInstance方法返回一個Calendar對象(該對象為Calendar的子類對象),其日歷字段已由當前日期和時間初始化:
Calendar rightNow = Calendar.getInstance();
為什么說返回的是Calendar的子類對象呢,因為每個國家地區都有自己的一套日歷算法,比如西方國家的第一個星期大部分為星期日,而中國則為星期一,我們來看看getInstance方法獲取實例的源碼

/** * 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 的 month 從 0 開始,也就是全年 12 個月由 0 ~ 11 進行表示。
而 Calendar.DAY_OF_WEEK 定義值如下,每周從 SUNDAY 開始,從 1 ~ 7:
Calendar.SUNDAY = 1
Calendar.MONDAY = 2
Calendar.TUESDAY = 3
Calendar.WEDNESDAY = 4
Calendar.THURSDAY = 5
Calendar.FRIDAY = 6
Calendar.SATURDAY = 7
Java Calendar 演示代碼如下:
package demo; import java.util.Date; import java.text.SimpleDateFormat; import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; public class Test { public Test() { } public static void main(String[] args) { // 字符串轉換日期格式 // DateFormat fmtDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 接收傳入參數 // String strDate = args[1]; // 得到日期格式對象 // Date date = fmtDateTime.parse(strDate); // 完整顯示今天日期時間 String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date()); System.out.println(str); // 創建 Calendar 對象 Calendar calendar = Calendar.getInstance(); try { // 對 calendar 設置時間的方法 // 設置傳入的時間格式 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-d H:m:s"); // 指定一個日期 Date date = dateFormat.parse("2013-6-1 13:24:16"); // 對 calendar 設置為 date 所定的日期 calendar.setTime(date); // 按特定格式顯示剛設置的時間 str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime()); System.out.println(str); } catch (ParseException e) { e.printStackTrace(); } // 或者另一種設置 calendar 方式 // 分別爲 year, month, date, hourOfDay, minute, second calendar = Calendar.getInstance(); calendar.set(2013, 1, 2, 17, 35, 44); str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime()); System.out.println(str); // Calendar 取得當前時間的方法 // 初始化 (重置) Calendar 對象 calendar = Calendar.getInstance(); // 或者用 Date 來初始化 Calendar 對象 calendar.setTime(new Date()); // setTime 類似上面一行 // Date date = new Date(); // calendar.setTime(date); str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime()); System.out.println(str); // 顯示年份 int year = calendar.get(Calendar.YEAR); System.out.println("year is = " + String.valueOf(year)); // 顯示月份 (從0開始, 實際顯示要加一) int month = calendar.get(Calendar.MONTH); System.out.println("nth is = " + (month + 1)); // 本周幾 int week = calendar.get(Calendar.DAY_OF_WEEK); System.out.println("week is = " + week); // 今年的第 N 天 int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR); System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR); // 本月第 N 天 int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH); System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH)); // 3小時以后,Calendar.HOUR_OF_DAY是24小時制Calendar.HOUR是12小時制
calendar.add(Calendar.HOUR_OF_DAY, 3); int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY); System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY); // 當前分鍾數 int MINUTE = calendar.get(Calendar.MINUTE); System.out.println("MINUTE = " + MINUTE); // 15 分鍾以后 calendar.add(Calendar.MINUTE, 15); MINUTE = calendar.get(Calendar.MINUTE); System.out.println("MINUTE + 15 = " + MINUTE); // 30分鍾前 calendar.add(Calendar.MINUTE, -30); MINUTE = calendar.get(Calendar.MINUTE); System.out.println("MINUTE - 30 = " + MINUTE); // 格式化顯示 str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime()); System.out.println(str); // 重置 Calendar 顯示當前時間 calendar.setTime(new Date()); str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime()); System.out.println(str); // 創建一個 Calendar 用於比較時間 Calendar calendarNew = Calendar.getInstance(); // 設定為 5 小時以前,后者大,顯示 -1 calendarNew.add(Calendar.HOUR, -5); System.out.println("時間比較:" + calendarNew.compareTo(calendar)); // 設定7小時以后,前者大,顯示 1 calendarNew.add(Calendar.HOUR, +7); System.out.println("時間比較:" + calendarNew.compareTo(calendar)); // 退回 2 小時,時間相同,顯示 0 calendarNew.add(Calendar.HOUR, -2); System.out.println("時間比較:" + calendarNew.compareTo(calendar)); } }
運行結果
2013-06-07 23:27:34:195 2013-06-01 13:24:16:000 2013-02-02 17:35:44:197 2013-06-07 23:27:34:197 year is = 2013 nth is = 6 week is = 6 DAY_OF_YEAR is = 158 DAY_OF_MONTH = 7 HOUR_OF_DAY + 3 = 2 MINUTE = 27 MINUTE + 15 = 42 MINUTE - 30 = 12 2013-06-08 02:12:34:197 2013-06-07 23:27:34:199 時間比較:-1 時間比較:1 時間比較:0
要計算時間差,可用 Calendar.getTimeInMillis() 取得兩個時間的微秒級的時間差,再加以換算即可,比如獲得相差天數,代碼如下:
// 得微秒級時間差 long val = calendarEnd.getTimeInMillis() - calendarBegin.getTimeInMillis(); // 換算后得到天數 long day = val / (1000 * 60 * 60 * 24);
其他與 date 相關的類型轉換代碼如下。
Timestamp 類型轉換為 Date 類型:
Timestamp stamp = new Timestamp(System.currentTimeMillis()); Date date = new Date(stamp.getTime()); System.out.println(date);
Timestamp 類型轉換為 Calendar 類型:
// 獲取 Timestamp 類型時間 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); // 轉換為 Calendar 類型,SUN 也推薦用 Calendar 處理時間信息 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp.getTime());
Date 類型轉換為 Calendar 類型
// Date 向 Calendar 賦值 calendar.setTime(date);
Calendar 類型轉換為 Timestamp 類型:
// 創建 Calendar 對象,也同時獲取了當前時間 Calendar calendar = Calendar.getInstance(); // 轉換為 Timestamp 類型對象 Timestamp timestamp = new Timestamp(calendar.getTimeInMillis()); System.out.println(timestamp);
Calendar 類型轉換為 Date 類型:
// Calendar 對象類型轉換為 Date 對象類型 Calendar calendar = Calendar.getInstance(); java.util.Date date = calendar.getTime(); System.out.println(date);
add() 與 roll() 的區別
add() 的功能非常強大,add 可以對 Calendar 的字段進行計算。如果需要減去值,那么使用負數值就可以了,如 add(field, -value)。
add() 有兩條規則:
當被修改的字段超出它可以的范圍時,那么比它大的字段會自動修正。如:Calendar cal1 = Calendar.getInstance();cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,對嗎?System.out.println(cal1.getTime()); //結果是 2000-9-30
另一個規則是,如果比它小的字段是不可變的(由 Calendar 的實現類決定),那么該小字段會修正到變化最小的值。
以上面的例子,9-31 就會變成 9-30,因為變化最小。
Roll() 的規則只有一條:當被修改的字段超出它可以的范圍時,那么比它大的字段不會被修正。如:
Calendar cal1 = Calendar.getInstance();cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。
roll()函數處理,只會比相應的字段進行處理,不會智能的對其它字段也進行邏輯上的改變。但是add()函數會在邏輯上改變其它字段,使結果正確。
代碼如下:
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); System.out.println("當前日期:"+sf.format(c.getTime())); c.add(Calendar.DAY_OF_MONTH, 1); System.out.println("增加一天后日期:"+sf.format(c.getTime())); //打印結果 //當前日期: 2013-06-18 //增加一天后日期 : 2013-06-19
Java Calendar獲取年、月、日、時間
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); //獲取東八區時間 int year = c.get(Calendar.YEAR); //獲取年 int month = c.get(Calendar.MONTH) + 1; //獲取月份,0表示1月份 int day = c.get(Calendar.DAY_OF_MONTH); //獲取當前天數 int first = c.getActualMinimum(c.DAY_OF_MONTH); //獲取本月最小天數 int last = c.getActualMaximum(c.DAY_OF_MONTH); //獲取本月最大天數 int time = c.get(Calendar.HOUR_OF_DAY); //獲取當前小時 int min = c.get(Calendar.MINUTE); //獲取當前分鍾 int xx = c.get(Calendar.SECOND); //獲取當前秒 SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String curDate = s.format(c.getTime()); //當前日期 System.out.println("當前時間:"+year + "-" + month + "-"+ day + " "+time + ":" + min +":" + xx); System.out.println("第一天和最后天:" + first +"," + last); System.out.println("當前日期curDate====:" + curDate);
輸出結果:
當前時間:2012-9-25 22:50:54 第一天和最后天:1,30
當前日期curDate:2012-09-25 22:50:54
Calendar的計算
c.add(Calendar.YEAR, 1); c.add(Calendar.MONTH, 1); c.add(Calendar.DAY_OF_MONTH, 1); int year2 = c.get(Calendar.YEAR); int month2 = c.get(Calendar.MONTH) + 1; int day2 = c.get(Calendar.DAY_OF_MONTH); int firstD = c.getActualMinimum(c.DAY_OF_MONTH); int lastD = c.getActualMaximum(c.DAY_OF_MONTH); System.out.println("當前時間:"+year2 + "-" + month2 + "-"+ day2 + " "+time + ":" + min +":" + xx); System.out.println("第一天和最后天:" + firstD +"," + lastD);
輸出結果:
當前時間:2013-10-26 23:4:3 第一天和最后天:1,31
獲取上個月的年、月、日
Calendar c=Calendar.getInstance(); c.add(Calendar.MONTH, -1);//上個月 SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String year=String.valueOf(c.get(Calendar.YEAR)); String topDay = String.valueOf(c.getActualMinimum(Calendar.DAY_OF_MONTH)); String lastDay = String.valueOf(c.getActualMaximum(Calendar.DAY_OF_MONTH)); //上個月 String lastMonth=String.valueOf(c.get(Calendar.MONTH)+1).length()==2?String.valueOf(c.get(Calendar.MONTH)+1):"0"+String.valueOf(c.get(Calendar.MONTH)+1); String topDayMonth=year+"-"+lastMonth+"-"+"01" + " 00:00:00"; String lastDayMonth = year+"-"+lastMonth+"-"+lastDay+ " 23:59:59"; System.out.println("###year:" + year); System.out.println("###last month:" + lastMonth); System.out.println("###topday:" + topDayMonth); System.out.println("###lastday:" + lastDayMonth);
輸出結果
###year:2013
###last month:04
###topday:2013-04-01 00:00:00
###lastday:2013-04-30 23:59:59
轉自 http://hi.baidu.com/zzm_2007/item/3b967b1cd1586e4e2b3e2258
https://blog.csdn.net/joyous/article/details/9630893
https://www.cnblogs.com/huangminwen/p/6041168.html