获取某日期的开始时间和结束时间

1、使用LocalDate

import java.time.LocalDate;
import java.time.LocalTime;

// 当前时间(LocalDate方法
LocalDate currentLD = LocalDate.now();
System.out.println("当前时间:"+currentLD);

// 获取当前日期的开始时间(凌晨 00:00:00)
LocalDateTime startOfDayLD = currentLD.atStartOfDay();
System.out.println("当前日期的开始时间:"+startOfDayLD);

// 获取当前日期的结束时间(23:59:59.999999999)
LocalDateTime endOfDayLD = currentLD.atTime(LocalTime.MAX);
System.out.println("当前日期的结束时间:"+endOfDayLD);

结果如下:

当前时间:2023-11-29
当前日期的开始时间:2023-11-29T00:00
当前日期的结束时间:2023-11-29T23:59:59.999999999

2、使用LocalDateTime

import java.time.LocalDateTime;
import java.time.LocalTime;

// 当前时间(LocalDateTime方法
LocalDateTime currentLDT = LocalDateTime.now();
System.out.println("当前时间:"+currentLDT);

// 获取当前日期的开始时间(凌晨 00:00:00)
LocalDateTime startOfDayLDT = currentLDT.with(LocalTime.MIN);
System.out.println("当前日期的开始时间:"+startOfDayLDT);

// 获取当前日期的结束时间(23:59:59.999999999)
LocalDateTime endOfDayLDT = currentLDT.with(LocalTime.MAX);
System.out.println("当前日期的结束时间:"+endOfDayLDT);

结果如下:

当前时间:2023-11-29T15:25:44.178
当前日期的开始时间:2023-11-29T00:00
当前日期的结束时间:2023-11-29T23:59:59.999999999

3、使用Date+DateUtil工具类

import cn.hutool.core.date.DateTime;
import java.util.Date;
import cn.hutool.core.date.DateUtil;

// 当前时间(Date+DateUtil方法
Date current = new Date();
System.out.println("当前时间:"+current);

// 获取当前日期的开始时间(凌晨 00:00:00)
DateTime beginOfDay = DateUtil.beginOfDay(current);
System.out.println("当前日期的开始时间:"+beginOfDay);

// 获取当前日期的结束时间(23:59:59)
DateTime endOfDay = DateUtil.endOfDay(current);
System.out.println("当前日期的结束时间:"+endOfDay);

结果如下:

当前时间:Wed Nov 29 15:29:10 CST 2023
当前日期的开始时间:2023-11-29 00:00:00
当前日期的结束时间:2023-11-29 23:59:59

4、使用Date自定义方法

    import java.util.Date;

   /**
     * 获取指定日期的开始时间(当天的凌晨)
     *
     * @param date 输入日期
     * @return 开始时间
     * @throws IllegalArgumentException 如果日期参数为空
     */
    public static Date getBeginOfDay(Date date) {
        if (date == null) {
            date = new Date();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }

   /**
     * 获取指定日期的结束时间(当天的最后一刻)
     *
     * @param date 输入日期
     * @return 结束时间
     * @throws IllegalArgumentException 如果日期参数为空
     */
    public static Date getEndOfDay(Date date) {
        if (date == null) {
            date = new Date();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        return calendar.getTime();
    }

结果如下:

调用方法:
Date now = new Date();
调用以上两种方法并将 now 传入。

当前时间:Wed Nov 29 15:48:56 CST 2023
当前日期的开始时间:Wed Nov 29 00:00:00 CST 2023
当前日期的结束时间:Wed Nov 29 23:59:59 CST 2023

各种时间的区别:

1. Date 类

   - `java.util.Date` 类是Java早期用于处理日期和时间的类。它表示特定的瞬间,精确到毫秒。
   - 结果类型:`Date`
   - 转换方式:可以使用 `toInstant` 方法将 `Date` 转换为 `Instant`,然后进一步转换为 `LocalDateTime` 或其他 `java.time` 类。

Date date = new Date();
Instant instant = date.toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

2. LocalDate、LocalTime、LocalDateTime 类

   - `java.time` 包引入了新的日期和时间API,包括 `LocalDate`、`LocalTime`、`LocalDateTime` 等类。它们提供了更好的不变性和线程安全性。
   - 结果类型:`LocalDate`、`LocalTime`、`LocalDateTime`
   - 转换方式:可以使用 `atStartOfDay` 方法将 `LocalDate` 转换为 `LocalDateTime`,或者使用 `toLocalDate` 和 `toLocalTime` 方法将 `LocalDateTime` 拆分为 `LocalDate` 和 `LocalTime`。

LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();

转换:

LocalDateTime dateTimeFromLocalDate = localDate.atStartOfDay();
LocalDate dateFromLocalDateTime = localDateTime.toLocalDate();
LocalTime timeFromLocalDateTime = localDateTime.toLocalTime();

3. SimpleDateFormat 类

   - `SimpleDateFormat` 类用于格式化和解析日期。它允许你定义自定义的日期格式。
   - 结果类型:`String`(格式化结果)、`Date`(解析结果)
   - 转换方式:使用 `format` 方法将 `Date` 或 `LocalDateTime` 格式化为字符串,使用 `parse` 方法将字符串解析为 `Date`。

// 使用 SimpleDateFormat 格式化 Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String formattedDate = sdf.format(date);

// 使用 SimpleDateFormat 解析字符串日期
Date parsedDate = sdf.parse("2023-01-01 12:00:00");

5、yyyy-MM-dd HH:mm字符串获取mm的开始及结束

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format1 = "2023-12-08 16:58" + ":00";
String format2 = "2023-12-08 16:58" + ":59";
System.out.println(format1);
System.out.println(format2);
Date parse1 = simpleDateFormat.parse(format1);
Date parse2 = simpleDateFormat.parse(format2);
System.out.println(parse1);
System.out.println(parse2);

结果如下:

2023-12-08 16:58:00
2023-12-08 16:58:59
Fri Dec 08 16:58:00 CST 2023
Fri Dec 08 16:58:59 CST 2023

注意:

如果是yyyy-MM-dd HH:mm而不是yyyy-MM-dd HH:mm:ss则秒转换为时间Date时都为00,不管定义或追加的数字为多少,结果都是00秒;并且如果字符串中没有秒(即yyyy-MM-dd HH:mm格式)则无法使用yyyy-MM-dd HH:mm:ss转换为时间,会报错。

6、获取距离当前时间日期(n天)的开始时间和结束时间

    public static void main(String[] args) {
        DateRange date = getBeginAndEndDateByDays(-1);
        System.out.println(date.getStartDate() + " ," + date.getEndDate()); // Sat Jan 13 00:00:00 CST 2024 ,Sat Jan 13 23:59:59 CST 2024}
    }

    /**
     * 获取距离当前时间日期(n天)的开始时间和结束时间
     * @param n
     * @return
     */
    public static DateRange getBeginAndEndDateByDays(int n) {
        Calendar calendar = Calendar.getInstance();
        // 当 n = 0; 表示当天;当 n = -1; 表示后一天;当 n = 1; 表示前一天;(因为calendar.add(Calendar.DAY_OF_YEAR, -n);为-n)
        calendar.add(Calendar.DAY_OF_YEAR, -n);
        Date endDate = getEndOfDay(calendar.getTime());
        Date startDate = getBeginOfDay(calendar.getTime());
        return new DateRange(startDate, endDate);
    }

    /**
     * 获取指定日期的开始时间(当天的凌晨)
     *
     * @param date 输入日期
     * @return 开始时间
     * @throws IllegalArgumentException 如果日期参数为空
     */
    public static Date getBeginOfDay(Date date) {
        if (date == null) {
            date = new Date();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }

    /**
     * 获取指定日期的结束时间(当天的最后一刻)
     *
     * @param date 输入日期
     * @return 结束时间
     * @throws IllegalArgumentException 如果日期参数为空
     */
    public static Date getEndOfDay(Date date) {
        if (date == null) {
            date = new Date();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        return calendar.getTime();
    }

    public static class DateRange {
        private final Date startDate;
        private final Date endDate;

        public DateRange(Date startDate, Date endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        public Date getStartDate() {
            return startDate;
        }

        public Date getEndDate() {
            return endDate;
        }
    }

你可能感兴趣的:(Java,java)