PrimeFaces计划日期错误

时间:2014-01-22 16:04:31

标签: jsf-2 primefaces schedule

我使用PF 4.0编写了一个JSF应用程序。它工作正常,但是来自ManagedBean的日期不正确。我检查了日志。它在dateSelect事件上是正确的,但它显示前一天< p:inputMask>。问题是什么?这是我的代码:

的index.xhtml

<h:form id="form">

        <p:growl id="messages" showDetail="true" />

        <p:schedule id="schedule" value="#{scheduleController.eventModel}" widgetVar="myschedule">

            <p:ajax event="dateSelect" listener="#{scheduleController.onDateSelect}" update="eventDetails" oncomplete="PF('eventDialog').show()" />
            <p:ajax event="eventSelect" listener="#{scheduleController.onEventSelect}" update="eventDetails" oncomplete="PF('eventDialog').show()" />
            <p:ajax event="eventMove" listener="#{scheduleController.onEventMove}" update="messages" />
            <p:ajax event="eventResize" listener="#{scheduleController.onEventResize}" update="messages" />

        </p:schedule>

        <p:dialog widgetVar="eventDialog" header="Event Details" showEffect="clip" hideEffect="clip">
            <h:panelGrid id="eventDetails" columns="2">
                <h:outputLabel for="title" value="Title:" />
                <p:inputText id="title" value="#{scheduleController.event.title}" required="true"/>

                <h:outputLabel for="from" value="From:" />
                <p:inputMask id="from" value="#{scheduleController.event.startDate}" mask="99/99/9999">
                    <f:convertDateTime pattern="dd/MM/yyyy" />
                </p:inputMask>

                <h:outputLabel for="to" value="To:" />
                <p:inputMask id="to" value="#{scheduleController.event.endDate}" mask="99/99/9999">
                    <f:convertDateTime pattern="dd/MM/yyyy" />
                </p:inputMask>

                <h:outputLabel for="allDay" value="All Day:" />
                <h:selectBooleanCheckbox id="allDay" value="#{scheduleController.event.allDay}" />
                <h:panelGrid columns="3" border="0">
                    <p:commandButton type="reset" value="Reset" />
                    <p:commandButton id="addButton" value="Save" 
                                     actionListener="#{scheduleController.addEvent}" 
                                     oncomplete="myschedule.update();eventDialog.hide();"/>
                    <p:commandButton value="Cancel" oncomplete="myschedule.update();eventDialog.hide();"
                                     actionListener="#{scheduleController.cancelEvent}"     />
                </h:panelGrid>

            </h:panelGrid>
        </p:dialog>

    </h:form>

ScheduleController.java

@ManagedBean
@ViewScoped
public class ScheduleController implements Serializable {

private ScheduleModel eventModel;
private ScheduleEvent event = new DefaultScheduleEvent();

public ScheduleController() {
    eventModel = new DefaultScheduleModel();
    eventModel.addEvent(new DefaultScheduleEvent("Champions League Match", previousDay8Pm(), previousDay11Pm()));
    eventModel.addEvent(new DefaultScheduleEvent("Birthday Party", today1Pm(), today6Pm()));
    eventModel.addEvent(new DefaultScheduleEvent("Breakfast at Tiffanys", nextDay9Am(), nextDay11Am()));
    eventModel.addEvent(new DefaultScheduleEvent("Plant the new garden stuff", theDayAfter3Pm(), fourDaysLater3pm()));
}

public Date getRandomDate(Date base) {
    Calendar date = Calendar.getInstance();
    date.setTime(base);
    date.add(Calendar.DATE, ((int) (Math.random() * 30)) + 1);  //set random day of month

    return date.getTime();
}

public Date getInitialDate() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(calendar.get(Calendar.YEAR), Calendar.FEBRUARY, calendar.get(Calendar.DATE), 0, 0, 0);

    return calendar.getTime();
}

public ScheduleModel getEventModel() {
    return eventModel;
}

private Calendar today() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), 0, 0, 0);

    return calendar;
}

private Date previousDay8Pm() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.PM);
    t.set(Calendar.DATE, t.get(Calendar.DATE) - 1);
    t.set(Calendar.HOUR, 8);

    return t.getTime();
}

private Date previousDay11Pm() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.PM);
    t.set(Calendar.DATE, t.get(Calendar.DATE) - 1);
    t.set(Calendar.HOUR, 11);

    return t.getTime();
}

private Date today1Pm() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.PM);
    t.set(Calendar.HOUR, 1);

    return t.getTime();
}

private Date theDayAfter3Pm() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.DATE, t.get(Calendar.DATE) + 2);
    t.set(Calendar.AM_PM, Calendar.PM);
    t.set(Calendar.HOUR, 3);

    return t.getTime();
}

private Date today6Pm() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.PM);
    t.set(Calendar.HOUR, 6);

    return t.getTime();
}

private Date nextDay9Am() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.AM);
    t.set(Calendar.DATE, t.get(Calendar.DATE) + 1);
    t.set(Calendar.HOUR, 9);

    return t.getTime();
}

private Date nextDay11Am() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.AM);
    t.set(Calendar.DATE, t.get(Calendar.DATE) + 1);
    t.set(Calendar.HOUR, 11);

    return t.getTime();
}

private Date fourDaysLater3pm() {
    Calendar t = (Calendar) today().clone();
    t.set(Calendar.AM_PM, Calendar.PM);
    t.set(Calendar.DATE, t.get(Calendar.DATE) + 4);
    t.set(Calendar.HOUR, 3);

    return t.getTime();
}

public ScheduleEvent getEvent() {
    return event;
}

public void setEvent(ScheduleEvent event) {
    this.event = event;
}

public void addEvent(ActionEvent actionEvent) {
    if (event.getId() == null) {
        eventModel.addEvent(event);
    } else {
        eventModel.updateEvent(event);
    }

    event = new DefaultScheduleEvent();
}

public void cancelEvent(ActionEvent actionEvent) {
    eventModel.deleteEvent(event);
    //event = new DefaultScheduleEvent();
}

public void onEventSelect(SelectEvent selectEvent) {
    event = (ScheduleEvent) selectEvent.getObject();
}

public void onDateSelect(SelectEvent selectEvent) {
    event = new DefaultScheduleEvent("", (Date) selectEvent.getObject(), (Date) selectEvent.getObject());
    System.out.println(selectEvent.getObject().toString());

}

public void onEventMove(ScheduleEntryMoveEvent event) {
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Event moved", "Day delta:" + event.getDayDelta() + ", Minute delta:" + event.getMinuteDelta());

    addMessage(message);
}

public void onEventResize(ScheduleEntryResizeEvent event) {
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Event resized", "Day delta:" + event.getDayDelta() + ", Minute delta:" + event.getMinuteDelta());

    addMessage(message);
}

private void addMessage(FacesMessage message) {
    FacesContext.getCurrentInstance().addMessage(null, message);
}

}

3 个答案:

答案 0 :(得分:2)

我有同样的问题,我通过在计划组件中添加时区来解决它。

        <p:schedule id="schedule" value="#{turnoController.eventModel}" widgetVar="myschedule" locale="es" timeZone="GMT-3">
            <p:ajax event="dateSelect" listener="#{turnoController.onDateSelect}" update=":TurnoCreateDlg :growl" oncomplete="PF('TurnoCreateDialog').show()" />
            <p:ajax event="eventSelect" listener="#{turnoController.onEventSelect}" update=":TurnoCreateDlg :growl" oncomplete="PF('TurnoCreateDialog').show()" />
        </p:schedule>

在这种情况下布宜诺斯艾利斯的时区

答案 1 :(得分:1)

最有可能的是,这是一个时区问题。即使它不是,那就是你应该开始寻找的地方你还没有为convertDateTime组件设置时区。假设你在GMT + 1,它应该是:

 <p:inputMask id="from" value="#{scheduleController.event.startDate}" mask="99/99/9999">
   <f:convertDateTime pattern="dd/MM/yyyy" timeZone="GMT+1" type="date" />
 </p:inputMask>

您的日历也是如此

private Calendar today() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+1"));
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), 0, 0, 0);

        return calendar;
    }

答案 2 :(得分:0)

为了解决这个问题,我增加了一天(+1)。它不是最好的解决方案,但对我有用,并且不会影响太多。