stackoverflow当中关于DateTimePicker问题的答案的改进版
stackoverflow问题地址:http://stackoverflow.com/questions/2055509/datetime-picker-in-android-application
本例子采用的方案雏形:https://github.com/krishjlk/android-date-and-time-picker-dialog-example-sample
示例项目下载地址
UI示例:
代码:
package com.yang.datetimepicker;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.app.Dialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TimePicker;
public class DateTimePickerDialog implements OnClickListener {
private DatePicker datePicker;
private TimePicker timePicker;
private Button btn_set, btn_cancel;
private Calendar calendar_date = null;
private Activity activity;
private ICustomDateTimeListener iCustomDateTimeListener = null;
private Dialog dialog;
private boolean is24HourView = true;
public DateTimePickerDialog(Activity a,
ICustomDateTimeListener customDateTimeListener) {
activity = a;
iCustomDateTimeListener = customDateTimeListener;
dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
View dialogView = getDateTimePickerLayout();
dialog.setContentView(dialogView);
}
public View getDateTimePickerLayout() {
View view = View.inflate(activity, R.layout.datetime_picker_dialog, null);
datePicker = (DatePicker) view.findViewById(R.id.datePicker);
timePicker = (TimePicker) view.findViewById(R.id.timePicker);
btn_set = (Button)view.findViewById(R.id.btn_set);
btn_set.setOnClickListener(this);
btn_cancel =(Button)view.findViewById(R.id.btn_cancel);
btn_cancel.setOnClickListener(this);
return view;
}
public void showDialog() {
if (!dialog.isShowing()) {
if (calendar_date == null)
calendar_date = Calendar.getInstance();
timePicker.setIs24HourView(is24HourView);
timePicker.setCurrentHour(calendar_date.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(calendar_date.get(Calendar.MINUTE));
datePicker.updateDate(calendar_date.get(Calendar.YEAR),
calendar_date.get(Calendar.MONTH),
calendar_date.get(Calendar.DATE));
dialog.show();
}
}
public void dismissDialog() {
if (!dialog.isShowing())
dialog.dismiss();
}
public void setDate(Calendar calendar) {
if (calendar != null)
calendar_date = calendar;
}
public void setDate(Date date) {
if (date != null) {
calendar_date = Calendar.getInstance();
calendar_date.setTime(date);
}
}
public void setDate(int year, int month, int day) {
if (month < 12 && month >= 0 && day < 32 && day >= 0 && year > 100
&& year < 3000) {
calendar_date = Calendar.getInstance();
calendar_date.set(year, month, day);
}
}
public void setTimeIn24HourFormat(int hourIn24Format, int minute) {
if (hourIn24Format < 24 && hourIn24Format >= 0 && minute >= 0
&& minute < 60) {
if (calendar_date == null)
calendar_date = Calendar.getInstance();
calendar_date.set(calendar_date.get(Calendar.YEAR),
calendar_date.get(Calendar.MONTH),
calendar_date.get(Calendar.DAY_OF_MONTH), hourIn24Format,
minute);
is24HourView = true;
}
}
public void setTimeIn12HourFormat(int hourIn12Format, int minute,
boolean isAM) {
if (hourIn12Format < 13 && hourIn12Format > 0 && minute >= 0
&& minute < 60) {
if (hourIn12Format == 12)
hourIn12Format = 0;
int hourIn24Format = hourIn12Format;
if (!isAM)
hourIn24Format += 12;
if (calendar_date == null)
calendar_date = Calendar.getInstance();
calendar_date.set(calendar_date.get(Calendar.YEAR),
calendar_date.get(Calendar.MONTH),
calendar_date.get(Calendar.DAY_OF_MONTH), hourIn24Format,
minute);
is24HourView = false;
}
}
public void set24HourFormat(boolean is24HourFormat) {
is24HourView = is24HourFormat;
}
public interface ICustomDateTimeListener {
public void onSet(Calendar calendarSelected, Date dateSelected,
int year, String monthFullName, String monthShortName,
int monthNumber, int date, String weekDayFullName,
String weekDayShortName, int hour24, int hour12, int min,
int sec, String AM_PM);
public void onCancel();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_set:
if (dialog.isShowing())
dialog.dismiss();
if (iCustomDateTimeListener != null) {
int month = datePicker.getMonth();
int year = datePicker.getYear();
int day = datePicker.getDayOfMonth();
calendar_date.set(year, month, day);
int hourOfDay = timePicker.getCurrentHour().intValue();
int minute = timePicker.getCurrentMinute().intValue();
calendar_date.set(year, month, day, hourOfDay, minute);
iCustomDateTimeListener.onSet(calendar_date, calendar_date
.getTime(), calendar_date.get(Calendar.YEAR),
getMonthFullName(calendar_date.get(Calendar.MONTH)),
getMonthShortName(calendar_date.get(Calendar.MONTH)),
calendar_date.get(Calendar.MONTH), calendar_date
.get(Calendar.DAY_OF_MONTH),
getWeekDayFullName(calendar_date
.get(Calendar.DAY_OF_WEEK)),
getWeekDayShortName(calendar_date
.get(Calendar.DAY_OF_WEEK)), calendar_date
.get(Calendar.HOUR_OF_DAY),
getHourIn12Format(calendar_date
.get(Calendar.HOUR_OF_DAY)), calendar_date
.get(Calendar.MINUTE), calendar_date
.get(Calendar.SECOND), getAMPM(calendar_date));
}
resetData();
break;
case R.id.btn_cancel:
if (dialog.isShowing())
dialog.dismiss();
if (iCustomDateTimeListener != null)
iCustomDateTimeListener.onCancel();
resetData();
break;
}
}
/**
* @param date
* date in String
* @param fromFormat
* format of your <b>date</b> eg: if your date is 2011-07-07
* 09:09:09 then your format will be <b>yyyy-MM-dd hh:mm:ss</b>
* @param toFormat
* format to which you want to convert your <b>date</b> eg: if
* required format is 31 July 2011 then the toFormat should be
* <b>d MMMM yyyy</b>
* @return formatted date
*/
public static String convertDate(String date, String fromFormat,
String toFormat) {
String formattedDate = "";
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(fromFormat);
Date d = simpleDateFormat.parse(date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(d);
simpleDateFormat = new SimpleDateFormat(toFormat);
simpleDateFormat.setCalendar(calendar);
formattedDate = simpleDateFormat.format(calendar.getTime());
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
return formattedDate;
}
/**
* @param monthNumber
* Month Number starts with 0. For <b>January</b> it is <b>0</b>
* and for <b>December</b> it is <b>11</b>.
* @return
*/
private String getMonthFullName(int monthNumber) {
String monthName = "";
if (monthNumber >= 0 && monthNumber < 12)
try {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, monthNumber);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMM");
simpleDateFormat.setCalendar(calendar);
monthName = simpleDateFormat.format(calendar.getTime());
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
return monthName;
}
/**
* @param monthNumber
* Month Number starts with 0. For <b>January</b> it is <b>0</b>
* and for <b>December</b> it is <b>11</b>.
* @return
*/
private String getMonthShortName(int monthNumber) {
String monthName = "";
if (monthNumber >= 0 && monthNumber < 12)
try {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, monthNumber);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM");
simpleDateFormat.setCalendar(calendar);
monthName = simpleDateFormat.format(calendar.getTime());
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
return monthName;
}
/**
* @param weekDayNumber
* Week Number starts with 1. For <b>Sunday</b> it is <b>1</b>
* and for <b>Saturday</b> it is <b>7</b>.
* @return
*/
private String getWeekDayFullName(int weekDayNumber) {
String weekName = "";
if (weekDayNumber > 0 && weekDayNumber < 8) {
try {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, weekDayNumber);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
simpleDateFormat.setCalendar(calendar);
weekName = simpleDateFormat.format(calendar.getTime());
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
}
return weekName;
}
/**
* @param weekDayNumber
* Week Number starts with 1. For <b>Sunday</b> it is <b>1</b>
* and for <b>Saturday</b> it is <b>7</b>.
* @return
*/
private String getWeekDayShortName(int weekDayNumber) {
String weekName = "";
if (weekDayNumber > 0 && weekDayNumber < 8) {
try {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, weekDayNumber);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE");
simpleDateFormat.setCalendar(calendar);
weekName = simpleDateFormat.format(calendar.getTime());
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
}
return weekName;
}
private int getHourIn12Format(int hour24) {
int hourIn12Format = 0;
if (hour24 == 0)
hourIn12Format = 12;
else if (hour24 <= 12)
hourIn12Format = hour24;
else
hourIn12Format = hour24 - 12;
return hourIn12Format;
}
private String getAMPM(Calendar calendar) {
String ampm = (calendar.get(Calendar.AM_PM) == (Calendar.AM)) ? "AM"
: "PM";
return ampm;
}
private void resetData() {
calendar_date = null;
is24HourView = true;
}
public static String pad(int i) {
return i <= 9 ? "0" + i : "" + i;
}
public static String getSecondsFromMillis(long milliseconds) {
return "" + ((int) ((milliseconds / 1000) % 60));
}
public static String getMinutesFromMillis(long milliseconds) {
return "" + (int) ((milliseconds / (1000 * 60)) % 60);
}
public static String getHoursFromMillis(long milliseconds) {
return "" + (int) ((milliseconds / (1000 * 60 * 60)) % 24);
}
/**
* @param monthNumber
* Month Number starts with 0. For <b>January</b> it is <b>0</b>
* and for <b>December</b> it is <b>11</b>.
* @param year
* @return
*/
public static int getDaysInMonth(int monthNumber, int year) {
int days = 0;
if (monthNumber >= 0 && monthNumber < 12) {
try {
Calendar calendar = Calendar.getInstance();
int date = 1;
calendar.set(year, monthNumber, date);
days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
}
return days;
}
/**
* @param monthNumber
* Month Number starts with 0. For <b>January</b> it is <b>0</b>
* and for <b>December</b> it is <b>11</b>.
* @return
*/
public static int getDaysInMonthInPresentYear(int monthNumber) {
int days = 0;
if (monthNumber >= 0 && monthNumber < 12) {
try {
Calendar calendar = Calendar.getInstance();
int date = 1;
int year = calendar.get(Calendar.YEAR);
calendar.set(year, monthNumber, date);
days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
} catch (Exception e) {
if (e != null)
e.printStackTrace();
}
}
return days;
}
public static int getDaysDifference(Date fromDate, Date toDate) {
if (fromDate == null || toDate == null)
return 0;
return (int) ((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
}
public static int getDaysDifference(Calendar calendar1, Calendar calendar2) {
if (calendar1 == null || calendar2 == null)
return 0;
return (int) ((calendar2.getTimeInMillis() - calendar1
.getTimeInMillis()) / (1000 * 60 * 60 * 24));
}
}