0

我需要做一个房间预订应用程序。我想从 datepicker 值中获取日期,然后从 timepicker 值中获取开始时间和结束时间。

为此,我想检查所选日期。然后,检查开始时间和结束时间是否以任何方式重叠,无论是所选日期的开始时间、结束时间还是介于两者之间。我一直在寻找解决方案,但没有找到。

例子 :

用户 A:日期=2013 年 5 月 27 日开始时间=10pm 结束时间=12pm

用户 B:日期=2013 年 5 月 28 日开始时间=10pm 结束时间=12pm

如果我是用户 C,并且我还想要 2013 年 5 月 27 日晚上 10 点到 12 点的时间段,我如何比较日期,如果用户 A 已经占用了该时间段,则比较开始时间和结束时间。

希望有人能指出我正确的方向 - 我是 Android 新手。任何帮助将不胜感激,谢谢!

我的时间选择器代码:

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;
}
4

1 回答 1

0

假设系统中已经有预订。我们称之为预订A。让我们将应用程序的用户尝试进行的预订称为Reservation B

这些预订中的每一个都在特定时间点开始和结束。Calendar如果您通过类的实例来表示这些点,那么您可以在实例之间进行比较以找出预留是否重叠。

你可以这样做:

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

日历被初始化为当前时间,因此您需要清除它们,因为您对秒和毫秒不感兴趣。如果你不这样做,比较两个日历是否相等可能会返回 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

现在您需要比较这些值。如果保留应该重叠,则必须发生以下情况:

  1. 预留 B的开始与预留 A的开始相同。
  2. 预留 B的开始位于预留A的开始和结束之间。
  3. End of Reservation B与 End of Reservation A相同。
  4. End of Reservation B介于Reservation A的开始和结束之间。
  5. Reservation B的开始在Reservation A 的 开始之前,并且Reservation B的结束在Reservation A的结束之后。

在代码中它可能如下所示:

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告诉您预订是否重叠。

我希望它可以理解并有所帮助。

于 2013-05-26T21:47:50.963 回答