关于jdk1.8时间操作

最近刚入职一家公司,这两天没啥事做,坐我旁边的同事让帮忙写一个方法,闲着也是闲着,于是很爽快的答应了。需求如下:

四个参数(startDate endDate number period)   startDate根据period推算直到<= endDate 记录符合的日期

比如 startDate(2020-07-15) number(2) period(天) endDate(2020-07-21) :从今天开始 每2天一个周期 直到<=2020-07-21,结果为三条记录:2020-07-17,2020-07-19,2020-07-21

代码如下:

1.先定义一个obj

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Date;



/**
 * @author leadhow
 * @date 2020/7/15
 **/
@Data
@AllArgsConstructor
public class DateObj {

    /**
     * 开始日期
     */
    private Date startDate;

    /**
     * 截至日期
     */
    private Date endDate;

    /**
     * 周期性间隔数
     */
    private String num;

    /**
     * 周期 (天、周、月)
     */
    private String period;
}

2.定义test类方法并测试

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author leadhow
 * @date 2020/7/15
 **/
public class Test1 {
    public static void main(String[] args) {
        //把时间设置为2020-07-21
        Calendar calendar  =   Calendar.getInstance();
        calendar.set(2020, Calendar.JULY, 21);
        Date date=calendar.getTime();
        
        List<Date> dates = getValidDate(new DateObj(new Date(), date, "2", "天"));
        dates.forEach( validDate -> System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(validDate)));
    }

    public static List<Date> getValidDate(DateObj obj) {
        LocalDate startDate = dateToLocalDate(obj.getStartDate());
        LocalDate endDate = dateToLocalDate(obj.getEndDate());
        if(startDate.equals(endDate) || startDate.isAfter(endDate)) {
            return new ArrayList<>();
        }
        long number = Long.valueOf(obj.getNum());
        String period = obj.getPeriod();
        return validDate(startDate,endDate,number,period);
    }

    /**
     *
     * @param startDate
     * @param endDate
     * @param number
     * @param period
     * @return 符合条件的日期
     */
    private static List<Date> validDate(LocalDate startDate, LocalDate endDate, long number, String period) {
        List<Date> dates = new ArrayList<>();
        while (startDate.isBefore(endDate)) {
            switch (period) {
                case "天" :
                    startDate = startDate.plus(number, ChronoUnit.DAYS);
                    break;
                case "周" :
                    startDate = startDate.plus(number, ChronoUnit.WEEKS);
                    break;
                case "月" :
                    startDate = startDate.plus(number,ChronoUnit.MONTHS);
                    break;
                default:
                    break;
            }
            if(startDate.isBefore(endDate) || startDate.equals(endDate)) {
                dates.add(localDateToDate(startDate));
            }
        }
        return dates;
    }

    /**
     * Date转localDate
     */
    public static LocalDate dateToLocalDate(Date date) {
        Instant instant = date.toInstant();
        ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
        return zdt.toLocalDate();
    }

    /**
     * localDate转Date
     */
    public static Date localDateToDate(LocalDate localDate) {
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        Instant instant1 = zonedDateTime.toInstant();
        return Date.from(instant1);
    }
}
结果:
2020-07-17
2020-07-19
2020-07-21

ps:好久没更了,其实没啥技术含量,刷个存在感 peace yo~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值