我正在创建一个应用程序,其中我显示日期选择器和时间选择器验证。我验证了时间选择器,因为我将当前时间与所选时间进行比较并设置消息“选择正确的时间”,它在选择当前日期时正常工作但是当我选择另一个日期时,它也显示“选择正确的时间”。我想以这种方式制作,当我选择另一个日期时,我应该允许我选择任何时间。我知道我必须根据日期选择设置它我不知道如何设置它。?
Calender c = Calendar.getInstance();
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
hourofday = c.get(Calendar.HOUR_OF_DAY);
minuteofday = c.get(Calendar.MINUTE);
totalCurrenttime = hourofday + minuteofday;
private void showDateDailog() {
final DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDate) {
year = selectedYear;
month = selectedMonth;
day = selectedDate;
((TextView) findViewById(R.id.textViewTORStartDate)).setText(new StringBuilder().append(day).append("/")
.append(month + 1).append("/").append(year))
}
}, year, month, day);
datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
datePickerDialog.show();
}
private void showTimeDailog() {
TimePickerDialog timePickerDialog = new TimePickerDialog(mContext, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
hour = selectedHour;
minute = selectedMinute;
int selectedTime = hour + minute;
if (validTime(totalCurrenttime, selectedTime)) {
((TextView) findViewById(R.id.textViewTORStartTime)).setText(selectedHour + ":" + selectedMinute);
} else {
Toast.makeText(getApplicationContext(), R.string.txt_select_correct_time, Toast.LENGTH_SHORT).show();
((TextView) findViewById(R.id.textViewTORStartTime)).setText(R.string.txt_Start_Time);
}
}
}, hour, minute, timeview);
timePickerDialog.show();
}
public boolean validTime(long current, long selected) {
boolean isValid = false;
if (selected > current) {
isValid = true;
}
return isValid;
}
答案 0 :(得分:1)
我同意@pleft认为您的验证问题是由于您的比较未考虑日期。编写涉及时间的软件是一件非常困难的事情,因此请使用库来简化流程。如果您使用java类,您可以以更简单的方式获得您正在寻找的结果。
从代码中可以看出,您希望用户选择 now 之后的日期和时间。 Calendar
课程可以提供帮助。
// initializing the date to the current time
private Calendar date = Calendar.getInstance();
// creating a date formatter to output the dateTime in the desired format
private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
private void showDateDialog() {
Calendar c = GregorianCalendar.getInstance();
final DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, dateSetListener,c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE));
datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
datePickerDialog.show();
}
// pulling out the listener for clarity
private DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDate) {
date = new GregorianCalendar(selectedYear, selectedMonth, selectedDate);
String dateString = sdf.format(date.getTime());
((TextView) findViewById(R.id.textViewTORStartDate)).setText(dateString);
}
};
private void showTimeDialog() {
Calendar c = Calendar.getInstance();
TimePickerDialog timePickerDialog = new TimePickerDialog(mContext, timeSetListener, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), timeView);
timePickerDialog.show();
}
// pulling out the listener for clarity
private TimePickerDialog.OnTimeSetListener timeSetListener =new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
// creating a clone of the existing date
Calendar newCal = Calendar.class.cast(date.clone());
// setting the hour & minute of the new calendar
newCal.set(Calendar.HOUR_OF_DAY, selectedHour);
newCal.set(Calendar.MINUTE, selectedMinute);
if (validTime(Calendar.getInstance(), newCal)) {
((TextView) findViewById(R.id.textViewTORStartTime)).setText(selectedHour + ":" + selectedMinute);
} else {
Toast.makeText(getApplicationContext(), R.string.txt_select_correct_time, Toast.LENGTH_SHORT).show();
((TextView) findViewById(R.id.textViewTORStartTime)).setText(R.string.txt_Start_Time);
}
}
};
public boolean validTime(Calendar current, Calendar selected) {
return 0 < selected.compareTo(current);
}
这方面的主要内容是利用java.util.Calendar
课程给你的力量。我强烈建议您查看Calendar doco和tutorials。此外,请记住,尽可能避免格式化您自己的日期/时间。如果你坚持使用普通的java库,那么SimpleDateFormat
就是你的朋友。 link
祝你好运!
答案 1 :(得分:0)
在validTime
方法中,您还必须传递DatePicker控件设置的日期,并将其与now
进行比较。如果是未来日期,则返回true而不进行比较时间。
e.g。
public boolean validTime(long current, long selected, long dateSet) {
if (dateSet > System.currentTimeMillis()) {
return true;
} else {
boolean isValid = false;
if (selected > current) {
isValid = true;
}
return isValid;
}
}
并使用onTimeSet
方法:
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
hour = selectedHour;
minute = selectedMinute;
int selectedTime = hour + minute;
Calendar cal = Calendar.getInstance();
cal.set(year, month, day);
if (validTime(totalCurrenttime, selectedTime, cal.getTimeInMillis())) {
((TextView) findViewById(R.id.textViewTORStartTime)).setText(selectedHour + ":" + selectedMinute);
} else {
Toast.makeText(getApplicationContext(), R.string.txt_select_correct_time, Toast.LENGTH_SHORT).show();
((TextView) findViewById(R.id.textViewTORStartTime)).setText(R.string.txt_Start_Time);
}
}