Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查特定日期,如果重叠,则根据时间选择器和日期选择器比较开始时间和结束时间_Java_Android_Datepicker_Timepicker - Fatal编程技术网

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

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点的时段,我

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

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

例如:

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

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

如果我是用户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;
}
我的日期选择器代码:

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
现在需要比较这些值。如果保留重叠,则必须出现以下情况:

  • 预订B的开始与预订A的开始相同
  • 预订B的开始在预订A的开始和结束之间
  • 预订B的结束与预订A的结束相同
  • 预订B的结束在预订A的开始和结束之间
  • 预订B的开始时间在预订A的开始时间之前,预订B的结束时间在预订A的结束时间之后
  • 在代码中,它可能如下所示:

    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对不起,我就是听不懂你的英语(谢谢你的解释,我会先试着理解,我能问你什么吗?再次感谢是的,如果你有问题,请随时提问。