سؤال

I have written a JSF app with using PF 4.0. It is working well but Date is not coming correctly from ManagedBean.I have checked the logs. It is right on dateSelect event, but it shows the previous day on < p:inputMask >. What is the problem? Here is my code:

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

}

هل كانت مفيدة؟

المحلول

I have the same issue and i fix it by adding the timezone in the schedule component.

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

in this case time zone for Buenos Aires

نصائح أخرى

Most likely, it's a timezone issue. Even if it's not, that's where you should start looking You haven't set the timezone to your convertDateTime component. Suppose you're in GMT+1, it should be:

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

The same for your calendar

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

To solve this, I added one day (+1). It's not the best solution, but works for me and it doesn't affect too much.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top