private String getStartTime(String param) { Date date = DateUtil.offsetHour(new Date(), -1); String startDate = DateUtil.format(date, "yyyyMMddHH"); if (StrUtil.isNotEmpty(param)) { try { Map<String, Object> params = JSONUtil.toBean(param, Map.class); if (ObjectUtil.isNotNull(params) && params.containsKey("startDateTime")) { startDate = MapUtil.getStr(params, "startDateTime", startDate); } } catch (Exception e) { log.error("时间段开始时间参数解析失败", e); } } return startDate; }解释一下
时间: 2024-02-14 08:35:24 浏览: 109
这是一个Java方法,它接受一个String类型的参数param,用于获取开始时间。首先,它使用DateUtil类的offsetHour方法获取当前时间往前推1小时的时间,并将其格式化成"yyyyMMddHH"的字符串格式,作为默认的开始时间startDate。然后,如果传入的参数param不为空,将其转换成Map对象,并判断是否包含"startDateTime"键,如果包含,就获取该键对应的值作为开始时间startDate。最后,返回得到的开始时间startDate。如果传入的参数转换成Map对象失败,会记录日志并返回默认的开始时间startDate。
相关问题
JAVA 计算指定工作日的工时 单位(分钟) (不用考虑指定工作日是否在开始结束之间和非工作时段) 1.传入工作时段字符串,格式为String(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm), 2.传入工作开始日期时间(Date类型) 3.传入工作结束日期时间(Date类型) 4.传入一个指定年月日(Date类型) 5.计算第4步中指定的这天工作日一共工作了有多少(分钟)
以下是一个可能的 Java 实现,可以满足上述要求:
```java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class WorkdayCalculator {
// 工作时段字符串,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm"
private String workHoursStr;
public WorkdayCalculator(String workHoursStr) {
this.workHoursStr = workHoursStr;
}
/**
* 计算指定日期是不是工作日
* @param date 指定日期
* @return 是工作日返回 true,否则返回 false
*/
private boolean isWorkday(Date date) {
// TODO: 可以根据实际情况实现判断逻辑,比如排除周末、节假日等
return true;
}
/**
* 计算指定日期的工作时间(单位:分钟)
* @param date 指定日期
* @return 工作时间(单位:分钟)
*/
public int getWorkMinutes(Date date) {
if (!isWorkday(date)) {
return 0;
}
SimpleDateFormat df = new SimpleDateFormat("HH:mm");
String dateStr = df.format(date);
String[] workHours = workHoursStr.split(";");
int workMinutes = 0;
for (String workHour : workHours) {
String[] startEnd = workHour.split("-");
String startStr = startEnd[0];
String endStr = startEnd[1];
try {
Date start = df.parse(startStr);
Date end = df.parse(endStr);
Calendar startTime = Calendar.getInstance();
startTime.setTime(date);
startTime.set(Calendar.HOUR_OF_DAY, start.getHours());
startTime.set(Calendar.MINUTE, start.getMinutes());
Calendar endTime = Calendar.getInstance();
endTime.setTime(date);
endTime.set(Calendar.HOUR_OF_DAY, end.getHours());
endTime.set(Calendar.MINUTE, end.getMinutes());
if (startTime.before(endTime)) {
if (dateStr.compareTo(startStr) >= 0 && dateStr.compareTo(endStr) <= 0) {
workMinutes += (int) ((endTime.getTimeInMillis() - startTime.getTimeInMillis()) / (1000 * 60));
}
} else {
// 跨天的情况
endTime.add(Calendar.DATE, 1);
if (dateStr.compareTo(startStr) >= 0 && dateStr.compareTo("23:59") <= 0) {
workMinutes += (int) ((endTime.getTimeInMillis() - startTime.getTimeInMillis()) / (1000 * 60));
} else if (dateStr.compareTo("00:00") >= 0 && dateStr.compareTo(endStr) <= 0) {
workMinutes += (int) ((endTime.getTimeInMillis() - startTime.getTimeInMillis()) / (1000 * 60));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return workMinutes;
}
public static void main(String[] args) {
String workHoursStr = "08:30-12:00;13:30-17:30";
WorkdayCalculator calculator = new WorkdayCalculator(workHoursStr);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date startDate = df.parse("2022-01-03 08:00:00");
Date endDate = df.parse("2022-01-05 18:00:00");
Date targetDate = df.parse("2022-01-04 12:30:00");
// 计算从 startDate 到 endDate 期间的工作时间
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
int totalWorkMinutes = 0;
while (cal.getTime().before(endDate)) {
totalWorkMinutes += calculator.getWorkMinutes(cal.getTime());
cal.add(Calendar.MINUTE, 1);
}
System.out.println("Total work minutes: " + totalWorkMinutes);
// 计算 targetDate 当天的工作时间
int workMinutes = calculator.getWorkMinutes(targetDate);
System.out.println("Work minutes on " + df.format(targetDate) + ": " + workMinutes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
这个实现中,`WorkdayCalculator` 类接受一个工作时段字符串作为参数,在构造方法中解析出每个工作时段的开始和结束时间。然后,对于给定的某个日期,可以调用 `getWorkMinutes` 方法计算这一天的工作时间。
在 `getWorkMinutes` 方法中,首先判断这一天是不是工作日,如果不是,则返回 0。然后遍历每个工作时段,解析出开始和结束时间,计算这个时段内的工作时间。如果这个时段跨越了一天(比如上午 9 点到次日下午 3 点),则需要特殊处理。
在 `main` 方法中,演示了如何使用 `WorkdayCalculator` 类计算从某个开始日期到结束日期之间的总工作时间,以及指定日期的工作时间。
JAVA 计算指定工作日的工时 单位(分钟) 1.传入工作时段字符串,格式为String(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm), 2.传入工作开始日期时间(Date类型) 3.传入工作结束日期时间(Date类型) 4.传入一个指定年月日(Date类型),该日期已知在工作开始和结束日期之间 5.根据工作的开始和结束日期 计算第4步中指定的这天一共工作了有多少(分钟)
以下是一个实现计算指定工作日工时的 Java 代码:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class WorkHoursCalculator {
public static void main(String[] args) throws ParseException {
String workHours = "09:00-12:00;13:00-18:00"; // 工作时段字符串
Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-08-02 09:00:00"); // 工作开始日期时间
Date endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-08-06 18:00:00"); // 工作结束日期时间
Date specifiedDate = new SimpleDateFormat("yyyy-MM-dd").parse("2021-08-04"); // 指定年月日
int workMinutes = calculateWorkMinutes(workHours, startDate, endDate, specifiedDate);
System.out.println("工作时长:" + workMinutes + " 分钟");
}
/**
* 计算指定工作日的工时(单位:分钟)
* @param workHours 工作时段字符串,格式为"HH:mm-HH:mm;HH:mm-HH:mm;..."
* @param startDate 工作开始日期时间
* @param endDate 工作结束日期时间
* @param specifiedDate 指定年月日
* @return 指定工作日的工时(单位:分钟)
*/
public static int calculateWorkMinutes(String workHours, Date startDate, Date endDate, Date specifiedDate) {
int workMinutes = 0;
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate); // 设置日历初始时间为工作开始日期时间
while (calendar.getTime().before(endDate)) { // 循环遍历工作时间段
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date currentDate = calendar.getTime();
if (sdf.format(currentDate).equals(sdf.format(specifiedDate))) { // 如果当前日期为指定日期
String[] workSegments = workHours.split(";"); // 分割工作时段字符串
for (String workSegment : workSegments) { // 遍历工作时段
String[] times = workSegment.split("-"); // 分割开始时间和结束时间
String startTime = times[0];
String endTime = times[1];
int startMinutes = getMinutes(startTime);
int endMinutes = getMinutes(endTime);
int workDayMinutes = endMinutes - startMinutes; // 当天的工作时间
int workMinutesInSegment = calculateWorkMinutesInSegment(currentDate, startTime, endTime); // 当天在该时间段内的工作时间
workMinutes += Math.min(workDayMinutes, workMinutesInSegment); // 取两者的最小值作为当天的工作时间
}
}
calendar.add(Calendar.DAY_OF_YEAR, 1); // 日历日期加1
}
return workMinutes;
}
/**
* 计算在指定时间段内的工作时间(单位:分钟)
* @param date 指定日期
* @param startTime 开始时间(格式为"HH:mm")
* @param endTime 结束时间(格式为"HH:mm")
* @return 在指定时间段内的工作时间(单位:分钟)
*/
private static int calculateWorkMinutesInSegment(Date date, String startTime, String endTime) {
int workMinutes = 0;
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
String currentDateStr = new SimpleDateFormat("yyyy-MM-dd").format(date);
String startDateTimeStr = currentDateStr + " " + startTime + ":00";
String endDateTimeStr = currentDateStr + " " + endTime + ":00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date startDateTime = sdf.parse(startDateTimeStr);
Date endDateTime = sdf.parse(endDateTimeStr);
while (calendar.getTime().before(endDateTime)) {
if (!calendar.getTime().before(startDateTime) && !calendar.getTime().after(endDateTime)) {
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
if (hourOfDay >= 9 && hourOfDay < 12 || hourOfDay >= 13 && hourOfDay < 18) { // 判断是否在工作时间段内
workMinutes++;
}
if (hourOfDay == 12) { // 中午休息1小时
calendar.add(Calendar.HOUR_OF_DAY, 1);
}
}
calendar.add(Calendar.MINUTE, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return workMinutes;
}
/**
* 将时间字符串转换成分钟数
* @param time 时间字符串(格式为"HH:mm")
* @return 分钟数
*/
private static int getMinutes(String time) {
String[] times = time.split(":");
int hour = Integer.parseInt(times[0]);
int minute = Integer.parseInt(times[1]);
return hour * 60 + minute;
}
}
```
这个代码可以计算指定工作日的工时,工作时段字符串格式为"HH:mm-HH:mm;HH:mm-HH:mm;...",开始日期时间和结束日期时间为 Date 类型,指定日期也为 Date 类型。实现思路如下:
1. 遍历工作时间段,判断当前日期是否为指定日期。
2. 如果是指定日期,则遍历该工作时间段,计算当天在该时间段内的工作时间。
3. 计算当天的工作时间,取当天在该时间段内的工作时间和当天的工作时间的最小值作为当天的工作时间。
4. 遍历完所有工作时间段,累加每个指定工作日的工时,返回总工时。
阅读全文