2014-01-22 60 views
3

我已經使用PF 4.0編寫了一個JSF應用程序。它運行良好,但Date從ManagedBean未能正確顯示。我檢查了日誌。它在dateSelect事件上是正確的,但它顯示前一天在< p:inputMask>。問題是什麼?這裏是我的代碼:PrimeFaces日程安排日期錯誤

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

}

回答

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> 

在布宜諾斯艾利斯

0

爲了解決這個問題,我加1天(+1)。這不是最好的解決方案,但適用於我,它不會影響太多。

+1

這並沒有真正回答這個問題這種情況時區。如果您有不同的問題,可以通過單擊[提問](http://stackoverflow.com/questions/ask)來提問。您還可以[添加賞金](http://stackoverflow.com/help/privileges/set-bounties)在您擁有足夠的[聲譽](http://stackoverflow.com/help/)時吸引更多人關注此問題什麼聲譽)。 – bartektartanus

+0

@bartektartanus我不同意。這是一個欺騙性的第一句話...... :) –

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