開發(fā)過程中需要獲取指定Date時間的前一天。本來覺得挺簡單的,用Calender.roll()方法回滾一天就行了,但是在測試過程中發(fā)現(xiàn)roll()方法在跨年日期下會輸出錯誤,于是查資料發(fā)現(xiàn)使用set()方法更方便可靠。于是記錄在此。
代碼在 github上,和greenDao連在一塊了。
代碼如下:
public class DateClass { public static void main(String[] args) throws ParseException { getYesterDayDate("20160102"); getYesterDayDate("20160101"); getYesterDayDate("20151231"); } public static void getYesterDayDate(String date) throws ParseException { //解析指定Date SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); Date parseDate = simpleDateFormat.parse(date); //設(shè)置Calendar Calendar calendar = GregorianCalendar.getInstance(); calendar.setTime(parseDate); /* * 核心代碼,回滾到前一天。 */ //backOne(calendar);//錯誤 backTwo(calendar);//正確 //轉(zhuǎn)換格式 String format = simpleDateFormat.format(calendar.getTime()); System.out.PRintln(format); } //使用roll()方法回滾 private static void backOne(Calendar calendar) { calendar.roll(Calendar.DAY_OF_YEAR, -1); } //使用set()方法回滾 private static void backTwo(Calendar calendar) { int day = calendar.get(Calendar.DATE); calendar.set(Calendar.DATE, day - 1); }}上述兩種back方式會輸出不同的結(jié)果。
使用backOne()方法 即使用 calendar.roll() 方法回滾,不會得到正確的結(jié)果。 輸出結(jié)果為:
2016010120161231 //這項不對20151230使用backTwo()方法 即使用calendar.set()方法回滾。是正確的。 輸出結(jié)果為:
201601012015123120151230roll()方法并不會級聯(lián)設(shè)置。即使使用GregorianCalendar也會有些問題。 set()方法會很好的處理年月日之間的變化。
同樣也可通過該方法獲取后一天,前一月、后一月等等。
善于使用Calender的API有時候會大大減少代碼量。
新聞熱點
疑難解答