java - 获取计算天数/添加当前日期的空值加上用户输入的值
问题描述
获取计算天数/添加当前日期的空值加上用户输入的值
我们正在根据用户输入的值计算列值,即用户输入的天数加上当前日期。
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 ,但之后我无法继续
解决方案
LocalDate::plusDays
使用LocalDate
而不是过时的Date
和Calendar
. 检查此以获取更多详细信息。
执行以下操作:
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
JPA和java.time
从属性中删除@Temporal
注释。另外,请注意,如果您使用的是JPA 2.1或更早版本,则需要编写一个转换器,如下所示。如果您使用的是JPA 2.2或更高版本,则不需要任何转换器。