デフォルトでは、これらすべてを同じカレンダー コンポーネントで行うことはできないと思います。ユーザーが日付を選択した後に値minHour
を変更する必要があるためです。minMinute
つまり、カレンダー コンポーネントを再度レンダリングする必要があります。
これを 2 つのコンポーネントに分けることができます。1 つは日付のみを選択するためのもので、もう 1 つは時間を選択するためのものです。
次に、ユーザーが日付を選択し、選択した日付に基づいて時間コンポーネントを再レンダリングし、選択した日付に従って と を設定するminHour
と、ajax 呼び出しを実行できminMinute
ます。
xhtml は次のようになります。
<p:calendar id="dateOnly" mindate="#{datePickerView.minDate}"
value="#{datePickerView.chosenDate}">
<p:ajax event="dateSelect" listener="#{datePickerView.handleDateSelect}" update="timeOnly" />
</p:calendar>
<br />
<p:calendar id="timeOnly" value="#{datePickerView.chosenTime}"
pattern="HH:mm" timeOnly="true" minHour="#{datePickerView.minHour}"
minMinute="#{datePickerView.minMinute}" />
Bean は次のようになります。
public class DatePickerView implements Serializable {
private static final long serialVersionUID = 1L;
private Date chosenDate;
private Date chosenTime;
public void handleDateSelect(DateSelectEvent event) {
chosenDate = event.getDate();
}
public Date getMinDate() {
return Calendar.getInstance().getTime();
}
public int getMinHour() {
if (chosenDate.after(Calendar.getInstance().getTime())) {
return 0;
} else {
return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
}
}
public int getMinMinute() {
if (chosenDate.after(Calendar.getInstance().getTime())) {
return 0;
} else {
return Calendar.getInstance().get(Calendar.MINUTE);
}
}
public Date getChosenDate() {
return chosenDate;
}
public void setChosenDate(Date chosenDate) {
this.chosenDate = chosenDate;
}
public Date getChosenTime() {
return chosenTime;
}
public void setChosenTime(Date chosenTime) {
this.chosenTime = chosenTime;
}
}
もちろん、タイムゾーンの処理などを追加する必要があります。