利用LocalDate获取每月几号,每周几

这篇博客介绍了如何利用Java 8中的LocalDate类来获取指定范围内每周四和每月31号的日期,以及如何获取当前日期的最早和最晚时间。推荐使用Java 8的日期时间API,以替代传统的Date和Calendar类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       jdk8为我们提供了非常好用的时间日期工具类。我们可以使用LocalDate 、LocalTime 、LocalDateTime来表示日期和时间,拥有极为方便的API满足业务需求,并且和数据库的字段可直接对应。这几个可以满足开发中的所有需求,极力推荐使用,请彻底放弃那些难用的Date 、Calendar吧!

Java8中的时间核心功能类如下:

描述
LocalTime只包含时间,如05:08:45
LocalDate只包含日期 如2019-02-05
LocalDateTime日期与时间,如2019-02-05 05:08:45(无时区)
ZonedOffset时区的偏移量,如 +08:00
ZonedDateTime包含时区的日期与时间
Instant时间戳,表达为“1970年初到这个时间点一共经过了多少纳秒
Duration表达一段时间,可以说Duration是两个Instant之间的时间差
Period时间段
Clock时钟
DateTimeFormatter负责格式化转换,内置了许多常用的格式。替换了之前的simpleDateFormatter

Java 7中包含下表中列出的类与方法:(这里仅作为一个回顾,推荐使用上面介绍的java8中新的日期类)

描述
System.currentTimeMillis()一个静态方法,返回当前日期时间(从1970年初到当前时间,经过了多少毫秒)
java.util.Date用于表示日期和时间的类,大多数里头的方法已经不推荐使用了(deprecated).
java.sql.Date用于表示日期的类,所有时间信息全被砍掉了,一般在数据库连接时使用
java.sql.Timestamp同上,只是保留了时间信息。
java.util.Calendar一个Calendar的基本类,可以对日期和时间进行操作,如加一天、一月、一年等等。
java.util.TimeZone用于表达时区的类,当跨时区进行Calendar操作时很有用。
SimpleDateFormat帮助把字符串解析为Date的类,同时也可将Date格式化为字符串。

在时间与字符串转换时经常会用到的表示:

y   = 年份 (yy or yyyy)
M   = 月份 (MM)
d   = 一个月中的第几天      (dd)
h   = 小时 (0-12)  (hh)
H   = 小时 (0-23)  (HH)
m   = 一小时中的第几分钟 (mm)
s   = 秒   (ss)
S   = 毫秒 (SSS)
z   = 时区 (比如:Pacific Standard Time)
Z   = 时区的时差 (比如:-0800)


yyyy-MM-dd           (2009-12-31)
yyyy-MM-dd HH:mm:ss  (2009-12-31 23:59:59)
HH:mm:ss.SSS         (23:59.59.999)
yyyy-MM-dd HH:mm:ss.SSS   (2009-12-31 23:59:59.999)

 // 两个都是ISO的标准时间格式,即2019-12-05T11:27:55.517+08:00
 public static final String DATE_FORMAT_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ";
 public static final String DATE_FORMAT_ISO_2 = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

1. 下面的工具类即利用LocalDate来获取指定范围内的日期,每周四,每月31号(没有则略过)


import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalField;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author 94977
 * @create 2018/12/8
 */
public class DateUtil {


    public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";


    public static LocalDate getLocalDateByStr(String str){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_YYYY_MM_DD);
       return LocalDate.parse(str, formatter);
    }

    /**
    * 获取指定日期范围内的所有指定星期 包含开始日期和结束日期
     * @param weeks 1,3,7表示周一,周三,周日
    * @return List<LocalDate>
    */
   public static List<LocalDate> getWeekLocalDateListByRange(LocalDate startDay, LocalDate endDay, List<String> weeks) {
        List<LocalDate> localDateList = new ArrayList<>();
        TemporalField fieldISO = WeekFields.of(DayOfWeek.of(1), 1).dayOfWeek();
        LocalDate tempDay;
        for (String week : weeks) {
            tempDay = startDay.with(fieldISO, Long.parseLong(week));
            if (tempDay.isBefore(startDay)) {
                tempDay = tempDay.plusWeeks(1);
            }
            while (tempDay.isBefore(endDay) || tempDay.isEqual(endDay)) {
                localDateList.add(tempDay);
                tempDay = tempDay.plusWeeks(1);
            }
        }
        return localDateList;
    }

    /**
     * 获取指定日期范围内的所有指定dayOfMonth 包含开始日期和结束日期
     * @param months 1,29,31表示每月的1号,29号,31号
     * @return List<LocalDate>
     */
    public static List<LocalDate> getLocalDateListByMonth(LocalDate startDate,LocalDate endDate,List<String> months){
        List<LocalDate> localDateList = new ArrayList<>();

        LocalDate localDate; 
        for(String month : months){
       		 LocalDate tempDate = startDate;
            while (tempDate.isBefore(endDate) || tempDate.getMonthValue() == endDate.getMonthValue()){
                if(tempDate.lengthOfMonth() >= Integer.valueOf(month)){
                    localDate = tempDate.withDayOfMonth(Integer.valueOf(month));
                    if(localDate.isAfter(startDate) || localDate.isEqual(startDate)){
                        localDate = tempDate.withDayOfMonth(Integer.valueOf(month));
                        if(localDate.isEqual(endDate) || localDate.isBefore(endDate)){
                            localDateList.add(localDate);
                        }
                    }
                }
                tempDate = tempDate.plusMonths(1);
            }
        }
        return localDateList;
    }

    /**
    * 获取指定范围内所有日期,包含开始日期和结束日期
    * @return List<LocalDate>
    */
    public static List<LocalDate> getLocalDateByDay(LocalDate startDate,LocalDate endDate){
        List<LocalDate> localDateList = Stream.iterate(startDate, date -> date.plusDays(1)).
                limit(ChronoUnit.DAYS.between(startDate, endDate))
                .collect(Collectors.toList());
        localDateList.add(endDate);
        return localDateList;
    }

    public static void main(String[] args) {
        LocalDate startDate = getLocalDateByStr("2018-10-27");
        LocalDate endDate = getLocalDateByStr("2018-11-05");
        System.out.println(getLocalDateByDay(startDate,endDate));
        List<String> strings = new ArrayList<>();
        strings.add("31");
        List<LocalDate> localDateListByweek = getLocalDateListByMonth(startDate, endDate, strings);
        System.out.println(localDateListByweek);
    }

}

2. 获取当天最晚和最早的时间

	public static final String DATE_FORMAT_ISO_8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

    /**
     * 转为ISO8601标准时间 2018-12-12T14:03:27.505+0800,使用默认时区
     * @param localDateTime localDateTime
     */
    public static String getStandardTime(LocalDateTime localDateTime){
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern(DATE_FORMAT_ISO_8601);
        ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
        return pattern.format(zonedDateTime);
    }

    /**
     * 返回当天最晚的时间2018-12-16T23:59:59.000+0800,使用默认时区
     * @param localDate localDate
     */
    public static String getEndTime(LocalDate localDate){
        return getStandardTime(localDate.plusDays(1).atStartOfDay().minusSeconds(1));
    }

    /**
     * 返回当天最早的时间2018-12-16T00:00:00.000+0800,使用默认时区
     * @param localDate localDate
     */
    public static String getStartTime(LocalDate localDate){
        return getStandardTime(localDate.atStartOfDay());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值