Calendar 日歷類的時間操作


我們經常會涉及到對時間的處理,例如登陸網站,我們會看到網站首頁顯示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;
}
View Code

 

 

 

注意事項:

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()函數會在邏輯上改變其它字段,使結果正確。

 

 java取得當前日期增加一天或多天

 

代碼如下:

復制代碼
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

 


免責聲明!

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



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