Java 检查特定日期,如果重叠,则根据时间选择器和日期选择器比较开始时间和结束时间
我需要做一个房间预订应用程序。我想从datepicker值获取日期,然后从timepicker值获取开始时间和结束时间 为此,我想检查所选日期。然后,检查开始时间和结束时间在所选日期的开始时间、结束时间或两者之间是否以任何方式重叠。我一直在寻找解决方案,但没有找到 例如: 用户A:日期=2013年5月27日开始时间=晚上10点结束时间=晚上12点 用户B:日期=2013年5月28日开始时间=晚上10点结束时间=晚上12点 如果我是用户C,并且我还希望2013年5月27日晚上10-12点的时段,我如何比较日期,然后比较开始时间和结束时间(如果该时段已由用户A占用) 希望有人能给我指出正确的方向——我是Android新手。任何帮助都将不胜感激,谢谢 我的时间选择器代码:Java 检查特定日期,如果重叠,则根据时间选择器和日期选择器比较开始时间和结束时间,java,android,datepicker,timepicker,Java,Android,Datepicker,Timepicker,我需要做一个房间预订应用程序。我想从datepicker值获取日期,然后从timepicker值获取开始时间和结束时间 为此,我想检查所选日期。然后,检查开始时间和结束时间在所选日期的开始时间、结束时间或两者之间是否以任何方式重叠。我一直在寻找解决方案,但没有找到 例如: 用户A:日期=2013年5月27日开始时间=晚上10点结束时间=晚上12点 用户B:日期=2013年5月28日开始时间=晚上10点结束时间=晚上12点 如果我是用户C,并且我还希望2013年5月27日晚上10-12点的时段,我
private TimePickerDialog.OnTimeSetListener timePickerStartListener = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
hour = selectedHour;
minute = selectedMinute;
// set current time into textview
textStartTime.setText(new StringBuilder().append(padding_str(hour)).append(":").append(padding_str(minute)));
}
};
private TimePickerDialog.OnTimeSetListener timePickerEndListener = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
hour = selectedHour;
minute = selectedMinute;
// set current time into textview
textEndTime.setText(new StringBuilder().append(padding_str(hour)).append(":").append(padding_str(minute)));
}
};
private static String padding_str(int c) {
if (c >= 10)
return String.valueOf(c);
else
return "0" + String.valueOf(c);
}
private DatePickerDialog.OnDateSetListener datePickerListener
= new DatePickerDialog.OnDateSetListener() {
// when dialog box is closed, below method will be called.
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
year = selectedYear;
month = selectedMonth;
day = selectedDay;
// set selected date into textview
tvDisplayDate.setText(new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, datePickerListener, year, month, day);
case START_TIME_DIALOG_ID:
return new TimePickerDialog(this, timePickerStartListener, hour, minute, false);
case END_TIME_DIALOG_ID:
return new TimePickerDialog(this, timePickerEndListener, hour, minute, false);
}
return null;
}
我的日期选择器代码:
private TimePickerDialog.OnTimeSetListener timePickerStartListener = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
hour = selectedHour;
minute = selectedMinute;
// set current time into textview
textStartTime.setText(new StringBuilder().append(padding_str(hour)).append(":").append(padding_str(minute)));
}
};
private TimePickerDialog.OnTimeSetListener timePickerEndListener = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
hour = selectedHour;
minute = selectedMinute;
// set current time into textview
textEndTime.setText(new StringBuilder().append(padding_str(hour)).append(":").append(padding_str(minute)));
}
};
private static String padding_str(int c) {
if (c >= 10)
return String.valueOf(c);
else
return "0" + String.valueOf(c);
}
private DatePickerDialog.OnDateSetListener datePickerListener
= new DatePickerDialog.OnDateSetListener() {
// when dialog box is closed, below method will be called.
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
year = selectedYear;
month = selectedMonth;
day = selectedDay;
// set selected date into textview
tvDisplayDate.setText(new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, datePickerListener, year, month, day);
case START_TIME_DIALOG_ID:
return new TimePickerDialog(this, timePickerStartListener, hour, minute, false);
case END_TIME_DIALOG_ID:
return new TimePickerDialog(this, timePickerEndListener, hour, minute, false);
}
return null;
}
假设系统中已经有预订。让我们称之为预约A。让我们称之为预约应用程序的用户正在尝试进行预约B 每一项保留都在特定的时间点开始和结束。如果通过的实例表示这些点,则可以在实例之间进行比较,以确定保留是否重叠 您可以这样做:
Calendar resAstart = Calendar.getInstance(); // Start of Reservation A
Calendar resAend = Calendar.getInstance(); // End of Reservation A
Calendar resBstart = Calendar.getInstance(); // Start of Reservation B
Calendar resBend = Calendar.getInstance(); // End of Reservation B
boolean overlap = false;
if (resBstart.equals(resAstart)) { // scenario 1
overlap = true;
} else if (resBstart.after(resAstart) && resBstart.before(resAend)) { // scenario 2
overlap = true;
} else if (resBend.equals(resAend)) { // scenario 3
overlap = true;
} else if (resBend.after(resAstart) && resBend.before(resAend)) { // scenario 4
overlap = true;
} else if (resBstart.before(resAstart) && resBend.after(resAend)) { // scenario 5
overlap = true;
}
日历将初始化为当前时间,因此您需要清除它们,因为您对秒和毫秒不感兴趣。如果不这样做,比较两个日历是否相等可能会返回false,即使它们设置了相同的日、月、年、小时和分钟
resAstart.clear();
// the same for resAend, resBstart and resBend
现在您需要设置日历
resAstart.set(Calendar.YEAR, /* the year when Reservation A starts */);
resAstart.set(Calendar.MONTH, /* the month when Reservation A starts */);
// and so on
// the same for resAend, resBstart and resBend
现在需要比较这些值。如果保留重叠,则必须出现以下情况:
Calendar resAstart = Calendar.getInstance(); // Start of Reservation A
Calendar resAend = Calendar.getInstance(); // End of Reservation A
Calendar resBstart = Calendar.getInstance(); // Start of Reservation B
Calendar resBend = Calendar.getInstance(); // End of Reservation B
boolean overlap = false;
if (resBstart.equals(resAstart)) { // scenario 1
overlap = true;
} else if (resBstart.after(resAstart) && resBstart.before(resAend)) { // scenario 2
overlap = true;
} else if (resBend.equals(resAend)) { // scenario 3
overlap = true;
} else if (resBend.after(resAstart) && resBend.before(resAend)) { // scenario 4
overlap = true;
} else if (resBstart.before(resAstart) && resBend.after(resAend)) { // scenario 5
overlap = true;
}
现在,overlap
的值告诉您保留是否重叠
我希望它是可以理解的,并且有帮助。这些日期/时间选择器难道没有能力提供
date
对象吗?由于Date
本身实现了compariable
,您基本上完成了wrt比较。对不起,我不能真正理解第二段。你能再次解释一下你的请求吗?@Zabri hi,假设我选择了2013年5月27日的日期,然后我选择了开始和结束时间,比如晚上10-12点。如果其他用户选择的时间与我选择的时间(包括日期)重叠,我想比较开始和结束时间,因为可能第二天时间段是空的。我希望你能提供帮助me@fge你好我找不到你的意思,你能给我举个例子吗,thanks@kon对不起,我就是听不懂你的英语(谢谢你的解释,我会先试着理解,我能问你什么吗?再次感谢是的,如果你有问题,请随时提问。