我有一个正在创建轮类的项目。用户可以请求休息日,因此当我创建轮类时,我想检查该用户是否请求了该天的休息日。我已经使用 for 和 if 语句来执行此操作,但它看起来很困惑并且并不总是有效。有没有更简单的方法来做到这一点?
这是我创建类次的代码。
Shift createShift(@RequestBody ShiftParams params)
{
User u = userService.findByFirstName(params.text);
Set<User> userSets = new HashSet<>();
userSets.add(u);
List<Request> req = u.getRequests();
if(req != null && req.isEmpty()) //This creates the shift if
the user has no requests
{
Shift shift = new Shift();
shift.setStart(params.start);
shift.setEnd(params.end);
shift.setUsersShifts(userSets);
shiftService.save(shift);
}
else
{
for(Iterator<Request> it= req.iterator(); it.hasNext();)
{
Request empReq = it.next();
if(empReq.getStatus() == Status.Accepted)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //for string
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); //for localdate
//Request start date in LocalDate
Date d = empReq.getDate();
String rDateStart = sdf.format(d);
LocalDate reqStartDate = LocalDate.parse(rDateStart, formatter).minusDays(1);
System.out.println("Req start date is " + reqStartDate);
//Request end date in LocalDate
int numDays = empReq.getNumDays();
LocalDate endDateReq = reqStartDate.plusDays(numDays).plusDays(1);
System.out.println("Request finish date is" + endDateReq);
//Shift start date in LocalDate
String shiftDate = (params.start).format(formatter);
LocalDate formatDateTime = LocalDate.parse(shiftDate, formatter);
System.out.println("Shift date in date format " + formatDateTime);
if(formatDateTime.isAfter(reqStartDate) &&
formatDateTime.isBefore(endDateReq)) //checks is the user has requested day off
{
System.out.println("The employee has requested that day off");
} else { // if they havent requested that day off the shift is created
Shift shift = new Shift();
shift.setStart(params.start);
shift.setEnd(params.end);
shift.setUsersShifts(userSets);
shiftService.save(shift);
}
}
}
return null;
}
最佳答案
假设:params.start是java.util.Date类型
public Shift createShift(final @RequestBody ShiftParams params) {
User u = userService.findByFirstName(params.text);
Set<User> userSets = Collections.singleton(u);
List<Request> requests = u.getRequests();
if ( requests == null || requests.isEmpty() || hasNoDayOffOnShiftDate(requests, params)) //This creates the shift if the user has no requests
{
Shift shift = buildShift(params, userSets);
shiftService.save(shift);
return shift;
}
return null;
}
private boolean hasNoDayOffOnShiftDate(List<Request> requests, ShiftParams params) {
final LocalDate shiftStartDate = convertToLocalDate(params.start);
Optional<Request> request = requests
.stream()
.filter(req -> req.getStatus() == Status.Accepted)
.filter(req -> isDayOffOnShiftDate(req, shiftStartDate))
.findAny();
return request.isEmpty();
}
private boolean isDayOffOnShiftDate(Request empReq, LocalDate shiftStartDate) {
//Request start date in LocalDate
LocalDate reqStartDate = convertToLocalDate(empReq.getDate()).minusDays(1);
System.out.println("Req start date is " + reqStartDate);
//Request end date in LocalDate
int numDays = empReq.getNumDays();
LocalDate endDateReq = reqStartDate.plusDays(numDays).plusDays(1);
System.out.println("Request finish date is" + endDateReq);
if (shiftStartDate.isAfter(reqStartDate) &&
shiftStartDate.isBefore(endDateReq)) //checks is the user has requested day off
{
System.out.println("The employee has requested that day off");
return true;
}else {
return false;
}
}
private Shift buildShift(@RequestBody ShiftParams params, Set<User> userSets) {
Shift shift = new Shift();
shift.setStart(params.start);
shift.setEnd(params.end);
shift.setUsersShifts(userSets);
return shift;
}
public LocalDate convertToLocalDate(Date dateToConvert) {
return LocalDate.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
关于java - 检查请求日期是否在特定时间内的简单方法。使用 for 循环和 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56004821/