如果重叠,请根据时间戳和日期选择器检查特定日期并比较开始时间和结束时间

时间:2013-05-26 19:03:40

标签: java android datepicker timepicker

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

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

示例:

用户A:日期= 27可能是2013年开始时间=晚上10点结束时间= 12pm

用户B:日期= 28可能是2013年开始时间=晚上10点结束时间= 12pm

如果我是用户C,并且我还想在2013年5月27日的10-12pm时段,如何比较日期,然后比较用户A已经采用时隙的开始时间和结束时间

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

我的Timepicker代码:

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

我的DatePicker代码:

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

1 个答案:

答案 0 :(得分:0)

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

每个预订都会在某些时间点开始和结束。如果您通过Calendar class的实例表示这些点,则可以在实例之间进行比较,以确定保留是否重叠。

您可以这样做:

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. 预订B 的结尾与预订A 的结尾相同。
  4. 预订B 的结尾位于预订A 的开头和结尾之间。
  5. 预订B 的开始是在预订A开始 AND 预订B 结束之后预订A
  6. 在代码中它看起来像这样:

    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的值会告诉您保留是否重叠。

    我希望这是可以理解的,并且有所帮助。