将 Primefaces datePicker 小时、分钟和秒限制为给定值

Limit the Primefaces datePicker hour, minutes and seconds to given values

提问人:Maria1995 提问时间:11/6/2023 更新时间:11/6/2023 访问量:41

问:

我正在使用 datePicker Primefaces 元素,以便允许用户选择小时、分钟和秒的值。目前,小时的值介于 0 和 24 之间,分钟介于 0 和 60 之间,秒数相同。

我想将这种选择的可能性限制为一些静态值,这些值是通过获取页面上发布的视频长度获得的。

因此,例如,如果视频有 1 分 30 秒,我希望小时部分不允许用户向上或向下按箭头,分钟最多为 30 分钟,分钟为 1。 我尝试了下面的代码,但它不起作用 - 当我进入页面时,我设法看到视频的最大长度,但是如果我从 datePicker 元素中移动箭头,我可以选择任何内容。

我能做些什么?

UI datePicker 元素:

<p:outputPanel styleClass="input-group timestamp-input">
                                <p:datePicker id="timeDatePicker"
                                              widgetVar="widgetVarOfDatePicker"
                                              value="#{traineeDashboard.newIncidentTimestamp}"
                                              timeOnly="true"
                                              showSeconds="true"
                                              appendTo="@this">
                                    <f:converter converterId="timeConverter"/>
                                </p:datePicker>

JS代码:


function setMaxTimeForDatePicker(hours, minutes, seconds) {
    var timePicker = PF('widgetVarOfDatePicker'); 
    var hoursDropdown = $('div.ui-hour-picker span:eq(1)');
    var minutesDropdown = $('div.ui-minute-picker span:eq(1)');
    var secondsDropdown = $('div.ui-second-picker span:eq(1)');

    hoursDropdown.text(hours);
    minutesDropdown.text(minutes);
    secondsDropdown.text(seconds);

    hoursDropdown.trigger('change');
    minutesDropdown.trigger('change');
    secondsDropdown.trigger('change');
}

$(function() {
    var timePicker = PF('widgetVarOfDatePicker'); // Replace with your actual widgetVar

    // Override the behaviors for incrementing and decrementing hours, minutes, and seconds
    timePicker.cfg.onHourChange = function(newHour) {
        let maxHour = 2;
        let minHour = 0;
        if (newHour < minHour || newHour > maxHour) {
            // Set the hour back to the minimum or maximum as appropriate
            this.setTime(minHour, this.currentMinute, this.currentSecond);
        }
    };

    timePicker.cfg.onMinuteChange = function(newMinute) {
        if (newMinute < minMinute || newMinute > maxMinute) {
            // Set the minute back to the minimum or maximum as appropriate
            this.setTime(this.currentHour, minMinute, this.currentSecond);
        }
    };

    timePicker.cfg.onSecondChange = function(newSecond) {
        if (newSecond < minSecond || newSecond > maxSecond) {
            // Set the second back to the minimum or maximum as appropriate
            this.setTime(this.currentHour, this.currentMinute, minSecond);
        }
    };
});

JavaScript Java 素面

评论


答:

2赞 Keyboard Corporation 11/6/2023 #1

使用组件的 和 属性。由于要限制时间(小时、分钟、秒),因此可以将 和 设置为相同的日期,但时间不同。minDatemaxDatep:datePickerminDatemaxDate

首先,您需要创建一个具有您希望允许的最长时间的对象。为此,您可以创建一个对象,设置小时、分钟和秒,然后获取该对象。java.util.Datejava.util.Calendarjava.util.Date

例;

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, maxHour);
calendar.set(Calendar.MINUTE, maxMinute);
calendar.set(Calendar.SECOND, maxSecond);
Date maxTime = calendar.getTime();

然后,将此对象设置为组件的属性。DatemaxDatep:datePicker

在上面的代码中,是您在托管 Bean 中创建的对象。traineeDashboard.minDatetraineeDashboard.maxTimeDate

这样,用户将无法选择超出您指定范围的时间。

请记住将 and 属性设置为相同的日期,但时间不同。例如,如果要允许从 00:00:00 到 01:30:00 的时间范围,则可以将 设置为 00:00:00 和 设置为 01:30:00。minDatemaxDateminDatemaxDate

另请注意,和属性接受对象,而不是 or 对象。如果使用的是类,则可以使用类或类将它们转换为对象。minDatemaxDatejava.util.Datejava.time.LocalDateTimejava.time.LocalTimejava.timejava.util.Datejava.sql.Timestampjava.time.Instant

评论

0赞 Maria1995 11/7/2023
感谢您的回复,乍一看不错,但似乎我无法在没有实际日期的情况下在 java 中获得 Date 对象:它总是包含今天的日期或 1970 年 1 月 1 日,因此,它给出了一个错误