首页 > 解决方案 > 获取计算天数/添加当前日期的空值加上用户输入的值

问题描述

获取计算天数/添加当前日期的空值加上用户输入的值

我们正在根据用户输入的值计算列值,即用户输入的天数加上当前日期。

private Date setdaysAttendanceApprovedWithAdditionalDays(int daysAttendanceApproved2) {

    Date currentDate = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(currentDate);

    c.add(Calendar.DATE, daysAttendanceApproved2);

    Date currentDatePlusUserInput = c.getTime();
    return currentDatePlusUserInput;
}

期望的输出

如果用户输入值 10,则 2020 年 5 月 8 日加上 10,则输出将是 18-May-2020 在设置的 NewDate

问题

setNewdate setdaysAttendanceApprovedWithAdditionalDays 被设置为空

<h:form>
<p:panel id="panel" header="New User">

    <h:panelGrid columns="3" cellpadding="5">
        <p:outputLabel for="Additional Days" value="Additionaldays:" />
        <p:inputText id="additionaldays" value="#{saveMB.attendanceApprovalEntity.daysAttendanceApproved}">
        </p:inputText>
    </h:panelGrid>

    <p:commandButton value="Save" actionListener="#{saveMB.approveAttendance}" />
</p:panel>
</h:form>

保存MB.java

@ManagedBean(name = "saveMB")
@ViewScoped
public class saveMB implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(saveMB.class);

private Integer daysAttendanceApproved;

public Integer getdaysAttendanceApproved() {
    return daysAttendanceApproved;
}

public void setdaysAttendanceApproved(Integer daysAttendanceApproved) {
    this.daysAttendanceApproved = daysAttendanceApproved;
}

private Date newdate;

public Date getNewdate() {
    return newdate;
}

public void setNewdate(Date newdate) {
    this.newdate = newdate;
}

private AttendanceFlow attendanceApprovalEntity;

public AttendanceFlow getattendanceApprovalEntity() {
    return attendanceApprovalEntity;
}

public void setattendanceApprovalEntity(AttendanceFlow attendanceApprovalEntity) {
    this.attendanceApprovalEntity = attendanceApprovalEntity;
}


@PostConstruct
public void init() {

    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    Map<String, String> params = externalContext.getRequestParameterMap();

}

private Date setdaysAttendanceApprovedWithAdditionalDays(int daysAttendanceApproved2) {

    Date currentDate = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(currentDate);

    c.add(Calendar.DATE, daysAttendanceApproved2);

    Date currentDatePlusUserInput = c.getTime();
    return currentDatePlusUserInput;
}

public void approveAttendance(AjaxBehaviorEvent event) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    try {

        this.attendanceApprovalEntity.setNewdate(setdaysAttendanceApprovedWithAdditionalDays(this.attendanceApprovalEntity.getdaysAttendanceApproved())); 

    } catch (Exception e) {}

}
}

出勤流.java

@Entity
@Table(name = "ATTENDANCE_FLOW")
@NamedQuery(name = "AttendanceFlow.findAll", query = "SELECT h FROM AttendanceFlow h")
public class AttendanceFlow implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name = "ATTENDANCE_FLOW_ID_GENERATOR", sequenceName = "ATTENDANCE_FLOW_ID_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ATTENDANCE_FLOW_ID_GENERATOR")
@Column(name = "ATTENDANCE_FLOW_ID")
private Integer AttendanceFlowId;

@Column(name = "DAYS_ATTENDANCE_APPROVED")
private Integer daysAttendanceApproved;

@Column(name = "NEW_DATE")
@Temporal(TemporalType.DATE)
private Date newdate;

public Date getNewdate() {
    return newdate;
}

public void setNewdate(Date newdate) {
    this.newdate = newdate;
}    

public Integer getAttendanceFlowId() {
    return AttendanceFlowId;
}

public void setAttendanceFlowId(Integer AttendanceFlowId) {
    this.AttendanceFlowId = AttendanceFlowId;
}

public Integer getdaysAttendanceApproved() {
    return daysAttendanceApproved;
}

public void setdaysAttendanceApproved(Integer daysAttendanceApproved) {
    this.daysAttendanceApproved = daysAttendanceApproved;
}

}

在调试时我可以找到

 this.attendanceApprovalEntity.getdaysAttendanceApproved   

即用户输入的值类似于 10 ,但之后我无法继续

标签: javadatejsfcalendarlocaldate

解决方案


LocalDate::plusDays

使用LocalDate而不是过时的DateCalendar. 检查以获取更多详细信息。

执行以下操作:

private LocalDate setDaysAttendanceApprovedWithAdditionalDays(int daysAttendanceApproved) {
    LocalDate date = LocalDate.now();
    return date.plusDays(daysAttendanceApproved);
}

快速演示:

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(setDaysAttendanceApprovedWithAdditionalDays(10));
    }

    static LocalDate setDaysAttendanceApprovedWithAdditionalDays(int daysAttendanceApproved) {
        LocalDate date = LocalDate.now();
        return date.plusDays(daysAttendanceApproved);
    }
}

输出:

2020-05-18

JPAjava.time

从属性中删除@Temporal注释。另外,请注意,如果您使用的是JPA 2.1或更早版本,则需要编写一个转换器,如下所示。如果您使用的是JPA 2.2或更高版本,则不需要任何转换器。


推荐阅读