需求
最近遇到了一個需求,任意一個日期 加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
是一個比較實用的日曆計算,獲取日期的工具類。這裏也僅僅是把我遇到的我用過的功能做了個小總結。
如有錯誤,歡迎指正。