LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime minTime = localDateTime.with(LocalTime.MIN);
LocalDateTime maxTime = localDateTime.with(LocalTime.MAX);
Set<String> times = DateUtils.getTimes(Date.from(minTime.atZone(ZoneId.systemDefault()).toInstant()), Date.from(maxTime.atZone(ZoneId.systemDefault()).toInstant()));
package com.zygh.traffic.common.utils.date;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.*;
/**
* 时间工具类
*
* @author 芋道源码
*/
public class DateUtils {
/**
* 时区 - 默认
*/
public static final String TIME_ZONE_DEFAULT = "GMT+8";
/**
* 秒转换成毫秒
*/
public static final long SECOND_MILLIS = 1000;
public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
public static final String FORMAT_HOUR_MINUTE_SECOND = "HH:mm:ss";
/**
* 将 LocalDateTime 转换成 Date
*
* @param date LocalDateTime
* @return LocalDateTime
*/
public static Date of(LocalDateTime date) {
// 将此日期时间与时区相结合以创建 ZonedDateTime
ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault());
// 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳
Instant instant = zonedDateTime.toInstant();
// UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
return Date.from(instant);
}
/**
* 将 Date 转换成 LocalDateTime
*
* @param date Date
* @return LocalDateTime
*/
public static LocalDateTime of(Date date) {
// 转为时间戳
Instant instant = date.toInstant();
// UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
@Deprecated
public static Date addTime(Duration duration) {
return new Date(System.currentTimeMillis() + duration.toMillis());
}
public static boolean isExpired(Date time) {
return System.currentTimeMillis() > time.getTime();
}
public static boolean isExpired(LocalDateTime time) {
LocalDateTime now = LocalDateTime.now();
return now.isAfter(time);
}
public static long diff(Date endTime, Date startTime) {
return endTime.getTime() - startTime.getTime();
}
/**
* 创建指定时间
*
* @param year 年
* @param mouth 月
* @param day 日
* @return 指定时间
*/
public static Date buildTime(int year, int mouth, int day) {
return buildTime(year, mouth, day, 0, 0, 0);
}
/**
* 创建指定时间
*
* @param year 年
* @param mouth 月
* @param day 日
* @param hour 小时
* @param minute 分钟
* @param second 秒
* @return 指定时间
*/
public static Date buildTime(int year, int mouth, int day,
int hour, int minute, int second) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, mouth - 1);
calendar.set(Calendar.DAY_OF_MONTH, day);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒
return calendar.getTime();
}
public static Date max(Date a, Date b) {
if (a == null) {
return b;
}
if (b == null) {
return a;
}
return a.compareTo(b) > 0 ? a : b;
}
public static LocalDateTime max(LocalDateTime a, LocalDateTime b) {
if (a == null) {
return b;
}
if (b == null) {
return a;
}
return a.isAfter(b) ? a : b;
}
/**
* 计算当期时间相差的日期
*
* @param field 日历字段.<br/>eg:Calendar.MONTH,Calendar.DAY_OF_MONTH,<br/>Calendar.HOUR_OF_DAY等.
* @param amount 相差的数值
* @return 计算后的日志
*/
public static Date addDate(int field, int amount) {
return addDate(null, field, amount);
}
/**
* 计算当期时间相差的日期
*
* @param date 设置时间
* @param field 日历字段 例如说,{@link Calendar#DAY_OF_MONTH} 等
* @param amount 相差的数值
* @return 计算后的日志
*/
public static Date addDate(Date date, int field, int amount) {
if (amount == 0) {
return date;
}
Calendar c = Calendar.getInstance();
if (date != null) {
c.setTime(date);
}
c.add(field, amount);
return c.getTime();
}
/**
* 是否今天
*
* @param date 日期
* @return 是否
*/
public static boolean isToday(LocalDateTime date) {
return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now());
}
/**
* 传入两个时间范围,返回这两个时间范围内的所有日期,并保存在一个集合中
* @param beginTime
* @param endTime
* @return
* @throws ParseException
*/
public static List<String> findEveryDay(String beginTime, String endTime)
throws ParseException {
//1.创建一个放所有日期的集合
List<String> dates = new ArrayList();
//2.创建时间解析对象规定解析格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//3.将传入的时间解析成Date类型,相当于格式化
Date dBegin = sdf.parse(beginTime);
Date dEnd = sdf.parse(endTime);
//4.将格式化后的第一天添加进集合
dates.add(sdf.format(dBegin));
//5.使用本地的时区和区域获取日历
Calendar calBegin = Calendar.getInstance();
//6.传入起始时间将此日历设置为起始日历
calBegin.setTime(dBegin);
//8.判断结束日期是否在起始日历的日期之后
while (dEnd.after(calBegin.getTime())) {
// 9.根据日历的规则:月份中的每一天,为起始日历加一天
calBegin.add(Calendar.DAY_OF_MONTH, 1);
//10.得到的每一天就添加进集合
dates.add(sdf.format(calBegin.getTime()));
//11.如果当前的起始日历超过结束日期后,就结束循环
}
return dates;
}
/**
* 获取一段时间范围内所有时分时间,[01:00, 02:00, 03:00, ...]
*/
public static Set<String> getTimes(Date fromDate, Date toDate) {
Set<String> times = new HashSet<>();
SimpleDateFormat dateFormat = new SimpleDateFormat(
"HH:mm");
List<Date> hourlyInterval = getHourlyInterval(fromDate, toDate);
for (Date date : hourlyInterval) {
times.add(dateFormat.format(date));
}
return times;
}
private static List<Date> getHourlyInterval(Date fromDate, Date toDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(fromDate);
List<Date> hourlyInterval = new ArrayList<>();
hourlyInterval.add(calendar.getTime());
while (calendar.getTime().before(toDate)) {
calendar.add(Calendar.HOUR_OF_DAY, 1);
hourlyInterval.add(calendar.getTime());
}
return hourlyInterval;
}
}