需求:在做類似於微博的android客戶端的時候,要求有個定時發微薄功能,時間設置要求:初始化時間大於當前時間兩分鐘,設置時間不能超過十五天。
解決過程:在網上找了一部分參考資料,發現都不能很好的解決問題,查看了時間的API也沒有真正明白用法,據聽說java中最讓人費解的就是時間處理這塊。後來在一個同事的幫助下,找到了思路。
首先:創建一個類繼承 OnDateChangedListener OnTimeChangedListener
在代碼中初始化時間和日期控件,這裏用的是DatePicker和TimePicker
Calendar c = Calendar.getInstance();
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); // 加上這行代碼就哦了
oldTimeString = sdf.format(c.getTime());
//如果不初始化則不會對dataPicker進行監聽
datePicker.init(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), this);
//設置時間大於當前時間兩分鐘
timePicker.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(c.get(Calendar.MINUTE) + 2);
onDateChanged(null, 0, 0, 0); //通知修改時間爲初始化的時間
這樣處理就可以實現初始化時間大於當前時間兩分鐘,而且實現的是24小時制的模式。
然後就是自己在頁面裏進行時間的設置,通過監聽來實現時時的顯示時間信息:
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
System.out.println("你點擊了月份");
Calendar calendar = Calendar.getInstance();
calendar.set(datePicker.getYear(), datePicker.getMonth(),
datePicker.getDayOfMonth(), timePicker.getCurrentHour(),
timePicker.getCurrentMinute());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
setTimeString = sdf.format(calendar.getTime());
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
sdf2.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
textView.setText( sdf2.format(calendar.getTime()) );
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
onDateChanged(null, 0, 0, 0);
}
在點擊確定的時候,對設置的時間進行最後的判斷,主要是判斷時間是否大於15天的問題。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
try {
/**
* 提前兩分鐘
*/
setTimeDate = df.parse(setTimeString);
c1.setTime(setTimeDate);
c1.add(Calendar.MINUTE, 2);
setTimeDate = c1.getTime();
Date d2 = df.parse(oldTimeString);
/**
* 提前15天零兩分鐘
*/
c2.setTime(d2);
c2.add(Calendar.DAY_OF_MONTH, 15);
c2.add(Calendar.MINUTE, 2);
Date oldTimeDate = c2.getTime();
/**
* setTimeDate設置時間
* oldTimeDate當前時間 + 十五天零兩分鐘
* oldTimeDate - setTimeDate > 0 說明設置時間小於十五天
* = 0 說明設置時間等於15天
* < 0 說明設置時間大於15天
*/
diff = oldTimeDate.getTime() - setTimeDate.getTime() ;
} catch (Exception e) {
System.out.println("e=" + e);
}
這種加減時間的方式纔是正確的,現實的時候不會出現時間錯亂的問題。
通過對diff的比較大小就可以達到了時間不能超過十五天的目的。
/**
* diff屬於毫秒的差值 如果小於零說明設置時間大於15天 自動把時間調整到第十五天
* 如果大於大於15 * 1000 * 24 * 60 * 60 + 2 * 60 * 1000 說明設置時間小於當前時間 則自動把時間設置到當前時間
* 這裏又考慮到有兩分鐘的差值
*/
if (diff > 0) {
if (diff <= (15 * 1000 * 24 * 60 * 60 + 2 * 60 * 1000)) {
Intent intent = new Intent(SetTimes.this, SendMicoBlog.class);
Bundle bundle = new Bundle();
/*
* new一個Bundle對象,並將要傳遞的數據傳入
*/
bundle.putInt("hour", timePicker.getCurrentHour());
bundle.putInt("minute", timePicker.getCurrentMinute());
bundle.putInt("year", datePicker.getYear());
bundle.putInt("month", datePicker.getMonth() + 1);
bundle.putInt("date", datePicker.getDayOfMonth());
bundle.putLong("diff", setTimeDate.getTime());
System.out.println(datePicker.getMonth() + "month");
intent.putExtras(bundle);
setResult(3, intent);
SetTimes.this.finish();
} else {
Calendar c3 = Calendar.getInstance();
datePicker.init(c3.get(Calendar.YEAR), c3.get(Calendar.MONTH), c3.get(Calendar.DAY_OF_MONTH), SetTimes.this);
timePicker.setCurrentHour(c3.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(c3.get(Calendar.MINUTE) + 2);
Toast.makeText(SetTimes.this, "設置時間應該大於零", Toast.LENGTH_SHORT).show();
}
} else {
datePicker.init(c2.get(Calendar.YEAR), c2.get(Calendar.MONTH), c2.get(Calendar.DAY_OF_MONTH), SetTimes.this);
timePicker.setCurrentHour(c2.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(c2.get(Calendar.MINUTE) - 3);
Toast.makeText(SetTimes.this, "設置時間應該小於等於15天", Toast.LENGTH_SHORT).show();
}
onDateChanged(null, 0, 0, 0);
在時間不滿足的情況下,做了兩個處理,第一:如果小於當前時間則把時間調整到當前時間加兩分鐘;第二:如果設置時間大於15天,則把時間調整到第十五天的時間。最終問題最終得到解決