Android日期加任意天數計算方式

需求

最近遇到了一個需求,任意一個日期 加10天,再加20天,再加30天,應該怎麼計算?要考慮大小月(30天/31天),如果是2月還要考慮平年閏年。想想都會很頭疼。一大推邏輯等着自己處理。
android有一個 Calendar 類可以幫到我們非常簡單的處理這個問題。

Calendar

先看下實現方法。

	//獲取Calendar的實例,默認是當前的時間
 	Calendar rightNow = Calendar.getInstance();
 	//當前時間 加10天
	rightNow.add(Calendar.DAY_OF_YEAR, 10);
	//new SimgpleDateFormat 進行格式化
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
	//利用Calendar的getTime方法,將時間轉化爲Date對象
	Date date = rightNow.getTime();
	//利用SimpleDateFormat對象 把Date對象格式化
	String format = sdf.format(date);
	Log.e(TAG, "this time add 10 days = " + format);
	
	輸出日誌
	 this date add 10 days = 2019-06-29

所有方法的解釋都寫在註釋上了,也比較簡單,不再解釋了。

分析一波

	//獲取Calendar實例
	Calendar rightNow = Calendar.getInstance();
	
	public static Calendar getInstance()
    {
    	// 傳入默認的時區,和默認的地區
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
    }
	//調用了Calendar的兩個參數的實例化方法
	 private static Calendar createCalendar(TimeZone zone, Locale aLocale)
    {
        // BEGIN Android-changed: only support GregorianCalendar here
        return new GregorianCalendar(zone, aLocale);
        // END Android-changed: only support GregorianCalendar here
    }
    //然後調用了子類GregorianCalendar的方法
    public GregorianCalendar(TimeZone zone, Locale aLocale) {
        super(zone, aLocale);
        gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
        //這個System.currentTimeMillis()方法應該都很熟悉,獲取系統當前時間(毫秒值)。
        //這個setTimeMillis()方法,是調用了父類Calendar的方法。
        //所以如果我們想要對當前時間/日期進行操作的話,直接Calander.getInstance()就可以。
        setTimeInMillis(System.currentTimeMillis());
    }

任意日期的加減計算

上面的分析,我們知道了 setTimeMillis(long millis) 方法可以爲 Calendar 設置時間。其實還有個方法 setTime(Date date) 方法也可以設置。

	//看源碼我們也可以看到,setTime()調用的也是 setTimeMillis()
	public final void setTime(Date date) {
        setTimeInMillis(date.getTime());
    }

任意日期的加減計算

	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
	String source = "2019-06-10";
	try {
	    Date date = sdf.parse(source);
	    Calendar rightNow = Calendar.getInstance();
	    rightNow.setTime(date);
	    rightNow.add(Calendar.DAY_OF_YEAR, -60);
	    Date time = rightNow.getTime();
	    String format = sdf.format(time);
	    Log.e(TAG, source + "減60天爲:" + format);
	    //2019-06-10減60天爲:2019-04-11
	} catch (ParseException e) {
	    e.printStackTrace();
	}

其他功能

除了以上功能,Calenar 還有一些實用的小功能。

獲取星期數

Calendar rightNow = Calendar.getInstance();
int dayOfWeek = rightNow.get(Calendar.DAY_OF_WEEK);
Log.e(TAG,  " dayOfWeek = " + dayOfWeek);

輸出日誌:
dayOfWeek = 4
當天2019-06-19 是週三。

這裏要注意的是,返回4並不是星期四的意思。對應關係,可以看下面源碼。

Calendar.class

    public final static int SUNDAY = 1;
 
    public final static int MONDAY = 2;
 
    public final static int TUESDAY = 3;
 
    public final static int WEDNESDAY = 4;
 
    public final static int THURSDAY = 5;
 
    public final static int FRIDAY = 6;
 
    public final static int SATURDAY = 7;

獲取今天是公曆年的第幾天

int dayOfYear = rightNow.get(Calendar.DAY_OF_YEAR);
Log.e(TAG, "dayOfYear = " + dayOfYear);

輸入日誌
dayOfYear = 170

獲取其他信息

Calendar.YEAR //年份

Calendar.MONTH // 月份 (從0開始,1月 = 0)

Calendar.WEEK_OF_YEAR //公曆年份的第幾周

Calendar.DATE //和DAY_OF_MONTH一樣

Calendar.DAY_OF_MONTH //日份

Calendar.DAY_OF_YEAR //公曆年的第幾天

Calendar.DAY_OF_WEEK //星期數

Calendar.DAY_OF_WEEK_IN_MONTH //月份的第幾周
Calendar.WEEK_OF_MONTH //月份的第幾周
這兩個區別是。
WEEK_OF_MONTH:是日曆式的第幾周。比如某月的1號是週日,則該月的2號就是第二週。
DAY_OF_WEEK_IN_MONTH:是單純的按照天數來算。比如,一月31天,則一月一共有5周,1-7號爲第一週,8-14號爲第二週...

Calendar.AM_PM //上午還是下午

Calendar.HOUR //小時數(12小時制 0-11點)

Calendar.HOUR_OF_DAY //小時數(24小時制 0-23點)

Calendar.MINUTE //分鐘數

Calendar.SECOND //秒數

Calendar.MILLISECOND //毫秒數

Calendar.ZONE_OFFSET //時區偏移量(單位是毫秒) 
比如我們在東八區,所以要加8h,所以是 8*60*60*1000 = 28800000

Calendar.FIELD_COUNT //夏令時偏移量(單位是毫秒)

Calendar 是一個比較實用的日曆計算,獲取日期的工具類。這裏也僅僅是把我遇到的我用過的功能做了個小總結。

如有錯誤,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章