Browse Source

处理40个工作日的日期问题

master
xyiege 4 years ago
parent
commit
3521a67a11
  1. 26
      src/main/java/cn/chjyj/szwh/utils/DateUtils.java
  2. 71
      src/main/java/cn/chjyj/szwh/utils/WorkDayUtil.java
  3. 11
      src/test/java/cn/chjyj/szwh/NewTest.java
  4. 6
      urls.md

26
src/main/java/cn/chjyj/szwh/utils/DateUtils.java

@ -15,17 +15,18 @@ import java.util.Date;
public class DateUtils { public class DateUtils {
/** /**
* 时间转换成时间戳,参数和返回值都是字符串 * 时间转换成时间戳,参数和返回值都是字符串
* @param s *
* @param s
* @return res * @return res
* @throws ParseException * @throws ParseException
*/ */
public static long dateToStamp(String s) { public static long dateToStamp(String s) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
Date date = simpleDateFormat.parse(s); Date date = simpleDateFormat.parse(s);
long ts = date.getTime(); long ts = date.getTime();
return ts; return ts;
}catch (ParseException ex){ } catch (ParseException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
return 0l; return 0l;
@ -49,6 +50,7 @@ public class DateUtils {
/** /**
* 获取一个月的总天数 * 获取一个月的总天数
*
* @param date * @param date
* @return * @return
*/ */
@ -60,18 +62,25 @@ public class DateUtils {
/** /**
* 指定日期的前后几天 工作日 * 指定日期的前后几天 工作日
*
* @param oneday 特定日期 * @param oneday 特定日期
* @param amount 天数 前几天参数amount为负整数 * @param amount 天数 前几天参数amount为负整数
* @return * @return
*/ */
public static Date daysAgoOrAfter(Date oneday,int amount){ public static Date daysAgoOrAfter(Date oneday, int amount) {
Calendar mon = Calendar.getInstance(); Calendar mon = Calendar.getInstance();
mon.setTime(oneday); mon.setTime(oneday);
//如果今天是周六或周日 //如果今天是周六或周日
if (Calendar.SATURDAY == mon.get(Calendar.SATURDAY) || Calendar.SUNDAY == mon.get(Calendar.SUNDAY)) { // if (Calendar.SATURDAY == mon.get(Calendar.SATURDAY) || Calendar.SUNDAY == mon.get(Calendar.SUNDAY)) {
amount=amount+1; // amount=amount+1;
// }
// 最后得到的日子如果是周日 周六
if (Calendar.SATURDAY == mon.get(Calendar.SATURDAY)) {
amount+=2;
}
if (Calendar.SUNDAY == mon.get(Calendar.SUNDAY)) {
amount+=1;
} }
// 逢周六周日,日期延后一天 // 逢周六周日,日期延后一天
for (int i = 0; i < amount; i++) { for (int i = 0; i < amount; i++) {
mon.set(Calendar.DATE, mon.get(Calendar.DATE) + 1); mon.set(Calendar.DATE, mon.get(Calendar.DATE) + 1);
@ -86,10 +95,11 @@ public class DateUtils {
/** /**
* 日期本地化 * 日期本地化
* note:Date对象表示特定的日期和时间而LocalDate(Java8)对象只包含没有任何时间信息的日期 * note:Date对象表示特定的日期和时间而LocalDate(Java8)对象只包含没有任何时间信息的日期
*
* @param date * @param date
* @return * @return
*/ */
public static LocalDateTime convertDateToLocalDateTime(Date date){ public static LocalDateTime convertDateToLocalDateTime(Date date) {
// 系统时区 // 系统时区
ZoneId zoneId = ZoneId.systemDefault(); ZoneId zoneId = ZoneId.systemDefault();
Instant instant = date.toInstant(); Instant instant = date.toInstant();

71
src/main/java/cn/chjyj/szwh/utils/WorkDayUtil.java

@ -0,0 +1,71 @@
package cn.chjyj.szwh.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 工作日工具类
*/
public class WorkDayUtil {
/**
* 日期格式
*/
public static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
/**
* 获取工作日时间
*
* @param startDate 起始时间
* @param num num个工作日
* @return
*/
public static Date getWorkDay(Date startDate, int num) {
Date tomorrow = null;
int delay = 0;
while (delay < num-1) {
tomorrow = getTomorrow(startDate);
if (!isWeekend(SDF.format(tomorrow))) {
delay++;
}
startDate = tomorrow;
}
return startDate;
}
/**
* 判断日期字符串是否为周末
*
* @param dateString 日期字符串
* @return
*/
private static boolean isWeekend(String dateString){
boolean zm=false;
try {
Date date = SDF.parse(dateString);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
//return cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;
if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
zm=true;
}
}catch (ParseException ex){
ex.printStackTrace();
}
return zm;
}
/**
* 获取tomorrow的日期
*
* @param startDate 起始时间
* @return
*/
private static Date getTomorrow(Date startDate) {
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
cal.add(Calendar.DAY_OF_MONTH, +1);
return cal.getTime();
}
}

11
src/test/java/cn/chjyj/szwh/NewTest.java

@ -3,6 +3,7 @@ package cn.chjyj.szwh;
import cn.chjyj.szwh.mapper.FestivalsMapper; import cn.chjyj.szwh.mapper.FestivalsMapper;
import cn.chjyj.szwh.utils.DateUtils; import cn.chjyj.szwh.utils.DateUtils;
import cn.chjyj.szwh.utils.SzFileUtils; import cn.chjyj.szwh.utils.SzFileUtils;
import cn.chjyj.szwh.utils.WorkDayUtil;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.Test; import org.junit.Test;
@ -106,13 +107,15 @@ public class NewTest {
public void n2test(){ public void n2test(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try { try {
Date startd = sdf.parse("2022-10-18"); Date startd = sdf.parse("2022-10-17");
Date afdate = DateUtils.daysAgoOrAfter(startd,5); Date afdate =WorkDayUtil.getWorkDay(startd,40);
System.out.println(sdf.format(afdate)); //Date afdate = DateUtils.daysAgoOrAfter(startd,40);
System.out.println("40工作日后的日期:"+sdf.format(afdate));
}catch (Exception ex){ }catch (Exception ex){
ex.printStackTrace(); ex.printStackTrace();
} }
} }
/** /**

6
urls.md

@ -40,4 +40,8 @@
19. [SpringBoot设置动态定时任务](blog.csdn.net/wl_Honest/article/details/123654621) 19. [SpringBoot设置动态定时任务](blog.csdn.net/wl_Honest/article/details/123654621)
20. [java取n个工作日后的日期](https://www.cnblogs.com/yadongliang/p/9549349.html) 20. [java取n个工作日后的日期](https://www.cnblogs.com/yadongliang/p/9549349.html)
21. [JAVA获取N个工作日后的时间的工具类、考虑上班时间、时区](https://blog.csdn.net/qq_37136334/article/details/121381277)
22.[Java获取n天后的工作日时间](https://www.minedeed.com/Java/13.html)
Loading…
Cancel
Save