LocalDateUtils工具类

一. 前言:

小熙最近有些忙,刚想起来账号密码就马上登录了。刚用到自己写得时间工具类(JDK8新特性),就分享一波吧,凑一下活跃度,哈哈。

二. 代码:

	package com.chengxi.datalom.utils;
	
	import cn.hutool.core.date.DateTime;
	import cn.hutool.core.date.DateUnit;
	import cn.hutool.core.date.DateUtil;
	import com.chengxi.datalom.utils.common.CommonConstants;
	import lombok.extern.slf4j.Slf4j;
	import org.apache.commons.lang3.StringUtils;
	
	import java.time.*;
	import java.time.format.DateTimeFormatter;
	import java.util.*;
	
	/**
	 * 程熙cjp:https://blog.csdn.net/weixin_41133233
     * <p>
	 * 格式化时间工具类(Java 8新特性)
	 *   建议结合自己项目本身的异常捕获实现(有些方法的容错粒度请结合本身项目添加)
	 *   和日志相关实现等优化成适合自己项目的工具类
	 *
	 * @author chengxi
	 * @date 2020/1/5
	 */
	@Slf4j
	public class LocalDateUtils {
	
	
	    /**
	     * 完整时间(默认时间格式) yyyy-MM-dd HH:mm:ss
	     */
	    public static final String defaultTimeFormat = "yyyy-MM-dd HH:mm:ss";
	
	    /**
	     * 年月日(无下划线) yyyyMMdd
	     */
	    public static final String noUnderlineYMD = "yyyyMMdd";
	
	    /**
	     * 年月日(默认格式) yyyy-MM-dd
	     */
	    public static final String defaultYMD = "yyyy-MM-dd";
	
	    /**
	     * 年月日时分秒(无下划线) yyyyMMddHHmmss
	     */
	    public static final String noUnderlineYMDHMS = "yyyyMMddHHmmss";
	
	    /**
	     * 默认时分秒
	     */
	    public static final String defaultHMS = "HH:mm:ss";
	
	    /**
	     * 默认时分秒
	     */
	    public static final String defaultHM = "HH:mm";
	
	
	    /**
	     * 根据自定义格式返回,被格式的时间
	     *
	     * @param time
	     * @param formatterTime
	     * @return
	     */
	    public static LocalDateTime getLocalDateTime(String time, String formatterTime) {
	        return LocalDateTime.parse(time, DateTimeFormatter.ofPattern(formatterTime));
	    }
	
	    /**
	     * 只输入需要被格式化的时间,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
	     *
	     * @param time
	     * @return
	     */
	    public static LocalDateTime getLocalDateTime(String time) {
	        return StringUtils.isBlank(time) ? null:getLocalDateTime(time, defaultTimeFormat);
	    }
	
	    /**
	     * 根据输入的时间格式,返回当前时间
	     *
	     * @param formatterTime
	     * @return
	     */
	    public static String getNowTime(String formatterTime) {
	        if (StringUtils.isBlank(formatterTime)) {
	            formatterTime = defaultTimeFormat;
	        }
	        return DateTimeFormatter.ofPattern(formatterTime).format(LocalDateTime.now());
	    }
	
	    /**
	     * 返回当前时间,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
	     *
	     * @return
	     */
	    public static String getNowTime() {
	        return DateTimeFormatter.ofPattern(defaultTimeFormat).format(LocalDateTime.now());
	    }
	
	    /**
	     * 根据时间格式返回时间字符串
	     *
	     * @param localDateTime
	     * @param formatterTime
	     * @return
	     */
	    public static String getTimeString(LocalDateTime localDateTime, String formatterTime) {
	        return DateTimeFormatter.ofPattern(formatterTime).format(localDateTime);
	    }
	
	    /**
	     * 返回完整时间(默认时间格式)字符串
	     *
	     * @param localDateTime
	     * @return
	     */
	    public static String getTimeString(LocalDateTime localDateTime) {
	        return DateTimeFormatter.ofPattern(defaultTimeFormat).format(localDateTime);
	    }
	
	    /**
	     * 返回完整时间(默认时间格式)字符串
	     *
	     * @param date
	     * @return
	     */
	    public static String getTimeString(Date date) {
	        return getTimeString(getLocalDateTime(date));
	    }
	
	    /**
	     * 将日期转换为字符串(默认格式)
	     *
	     * @param date
	     * @return
	     */
	    public static String getDateString(Date date) {
	        return DateTimeFormatter.ofPattern(defaultTimeFormat).format(getLocalDateTime(date));
	    }
	
	    /**
	     * 转换为LocalDateTime
	     *
	     * @param date
	     * @return
	     */
	    public static LocalDateTime getLocalDateTime(Date date) {
	        //An instantaneous point on the time-line.(时间线上的一个瞬时点。)
	        Instant instant = date.toInstant();
	        //A time-zone ID, such as {@code Europe/Paris}.(时区)
	        ZoneId zoneId = ZoneId.systemDefault();
	        return instant.atZone(zoneId).toLocalDateTime();
	    }
	
	    /**
	     * 获取毫秒值,默认东八区
	     *
	     * @param localDateTime
	     * @param offset
	     * @return
	     */
	    public static Long getTime(LocalDateTime localDateTime, String offset) {
	        return localDateTime.toInstant(ZoneOffset.of(StringUtils.isBlank(offset) ? "+8":offset)).toEpochMilli();
	    }
	
	    /**
	     * 获取毫秒值,默认东八区
	     *
	     * @param localDateTime
	     * @return
	     */
	    public static Long getTime(LocalDateTime localDateTime) {
	        return getTime(localDateTime, null);
	    }
	
	    /**
	     * 比较当前时间是否是输入时间之后,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
	     *
	     * @param enterTime
	     * @return
	     */
	    public static Boolean nowCompareEnterTimeIsAfter(String enterTime) {
	        return LocalDateTime.now().isAfter(LocalDateTime.parse(enterTime, DateTimeFormatter.ofPattern(defaultTimeFormat)));
	    }
	
	    /**
	     * 比较当前时间是否是输入时间之后
	     *
	     * @param enterTime
	     * @return
	     */
	    public static Boolean nowCompareEnterTimeIsAfter(LocalDateTime enterTime) {
	        return LocalDateTime.now().isAfter(enterTime);
	    }
	
	    /**
	     * 比较当前时间是否是输入时间之前,默认根据 defaultTimeFormat(yyyy-MM-dd HH:mm:ss) 格式
	     *
	     * @param enterTime
	     * @return
	     */
	    public static Boolean nowCompareEnterTimeIsBefore(String enterTime) {
	        return LocalDateTime.now().isBefore(LocalDateTime.parse(enterTime, DateTimeFormatter.ofPattern(defaultTimeFormat)));
	    }
	
	    /**
	     * 比较当前时间是否是输入时间之前
	     *
	     * @param enterTime
	     * @return
	     */
	    public static Boolean nowCompareEnterTimeIsBefore(LocalDateTime enterTime) {
	        return LocalDateTime.now().isBefore(enterTime);
	    }
	
	    /**
	     * 判断当前时间是否是在,输入的开始时间和结束时间之中
	     *
	     * @param startEnterTime
	     * @param endEnterTime
	     * @return
	     */
	    public static Boolean nowIsInEnterTime(LocalDateTime startEnterTime, LocalDateTime endEnterTime) {
	        return LocalDateTime.now().isAfter(startEnterTime) && LocalDateTime.now().isBefore(endEnterTime);
	    }
	
	    /**
	     * 判断输入第一个时间是否在第二个输入时间之前
	     *
	     * @param enterTimeOne
	     * @param enterTimeTwo
	     * @return
	     */
	    public static Boolean enterTimeOneIsEnterTimeTwoBefore(String enterTimeOne, String enterTimeTwo) {
	        return getLocalDateTime(enterTimeOne).isBefore(getLocalDateTime(enterTimeTwo));
	    }
	
	    /**
	     * 判断输入第一个时间是否在第二个输入时间之后
	     *
	     * @param enterTimeOne
	     * @param enterTimeTwo
	     * @return
	     */
	    public static Boolean enterTimeOneIsEnterTimeTwoAfter(String enterTimeOne, String enterTimeTwo) {
	        return getLocalDateTime(enterTimeOne).isAfter(getLocalDateTime(enterTimeTwo));
	    }
	
	    /**
	     * 判断两组时间没有交叉
	     *
	     * @param oneGroupStartTime
	     * @param oneGroupEndTime
	     * @param twoGroupStartTime
	     * @param twoGroupEndTime
	     * @return
	     */
	    public static Boolean twoGroupsOfTimeIsNotCross(String oneGroupStartTime, String oneGroupEndTime, String twoGroupStartTime, String twoGroupEndTime) {
	        return (enterTimeOneIsEnterTimeTwoBefore(oneGroupStartTime, twoGroupStartTime) &&
	                enterTimeOneIsEnterTimeTwoBefore(oneGroupEndTime, twoGroupStartTime)) ||
	                (enterTimeOneIsEnterTimeTwoAfter(oneGroupStartTime, twoGroupEndTime) &&
	                        enterTimeOneIsEnterTimeTwoAfter(oneGroupEndTime, twoGroupEndTime));
	    }
	
	    /**
	     * 判断两组时间没有交叉
	     *
	     * @param oneGroupStartTime
	     * @param oneGroupEndTime
	     * @param twoGroupStartTime
	     * @param twoGroupEndTime
	     * @return
	     */
	    public static Boolean twoGroupsOfTimeIsNotCross(LocalDateTime oneGroupStartTime, LocalDateTime oneGroupEndTime, LocalDateTime twoGroupStartTime, LocalDateTime twoGroupEndTime) {
	        return (oneGroupStartTime.isBefore(twoGroupStartTime) && oneGroupEndTime.isBefore(twoGroupStartTime)) ||
	                (oneGroupStartTime.isAfter(twoGroupEndTime) && oneGroupEndTime.isAfter(twoGroupEndTime));
	    }
	
	    /**
	     * 计算时间的小时差值
	     *
	     * @param startTime
	     * @param endTime
	     * @return
	     */
	    public static Double calcStartTimeAndEndTimeHourDifference(String startTime, String endTime, String dateTimeFormat) {
	        DateTime startDateTime = DateUtil.parse(startTime, dateTimeFormat);
	        DateTime endDateTime = DateUtil.parse(endTime, dateTimeFormat);
	
	        long minuteBetween = DateUtil.between(startDateTime, endDateTime, DateUnit.MINUTE);
	        return Double.valueOf(String.valueOf(minuteBetween)) / 60;
	    }
	
	    /**
	     * 将Excel中获取的时间小数转为时间(目前是时分)
	     *
	     * @param dateTimeNumber
	     * @return
	     */
	    @Deprecated
	    public static String getDateTimeByExcelImport(String dateTimeNumber) {
	        double timeNumber = Double.valueOf(dateTimeNumber) * 24;
	        double minuterNumber = MathUtil.formatOnlyTwoDecimalDouble(timeNumber) * 60;
	        return MathUtil.formatNonReservedDecimalString(timeNumber) + ":" + minuterNumber;
	    }
	
	    /**
	     * 获取DateTime
	     *
	     * @param dateString
	     * @param formatString
	     * @return
	     */
	    public static DateTime getDateTime(String dateString, String formatString) {
	        return DateTime.of(dateString, formatString);
	    }
	
	    /**
	     * 获取DateTime
	     *
	     * @param dateString
	     * @return
	     */
	    public static DateTime getDateTime(String dateString) {
	        return getDateTime(dateString, defaultHMS);
	    }
	
	    /**
	     * 第一个时间是否在第二个时间之后
	     *
	     * @param enterTimeOne
	     * @param enterTimeTwo
	     * @return
	     */
	    public static Boolean enterDateTimeOneIsEnterDateTimeTwoAfter(String enterTimeOne, String enterTimeTwo) {
	        return enterDateTimeOneIsEnterDateTimeTwoAfter(getDateTime(enterTimeOne), getDateTime(enterTimeTwo));
	    }
	
	    /**
	     * 第一个时间是否在第二个时间之后
	     *
	     * @param enterTimeOne
	     * @param enterTimeTwo
	     * @return
	     */
	    public static Boolean enterDateTimeOneIsEnterDateTimeTwoAfter(DateTime enterTimeOne, DateTime enterTimeTwo) {
	        return enterTimeOne.isAfter(enterTimeTwo);
	    }
	
	    /**
	     * 时间是否在[0-12]之间
	     *
	     * @param dateString
	     * @return
	     */
	    public static Boolean judgeTimeIsZeroToTwelve(String dateString) {
	        return getDateTime(dateString).isIn(getDateTime("00:00:00"), getDateTime("12:00:00"));
	    }
	
	    /**
	     * 校验两个时间是否都在[0-12]之间,或者都不在
	     *
	     * @param dateOneString
	     * @param dateTwoString
	     * @return
	     */
	    public static Boolean judgeTimeIsAllZeroToTwelveOrNoAllZeroToTwelve(String dateOneString, String dateTwoString) {
	        return (judgeTimeIsZeroToTwelve(dateOneString) && judgeTimeIsZeroToTwelve(dateTwoString)) || (!judgeTimeIsZeroToTwelve(dateOneString) && !judgeTimeIsZeroToTwelve(dateTwoString));
	    }
	
	
	
	    /**
	     * LocalDateTime转毫秒时间戳
	     *
	     * @param localDateTime
	     * @return
	     */
	    public static long getTimestamp(LocalDateTime localDateTime) {
	        ZoneId zone = ZoneId.systemDefault();
	        Instant instant = localDateTime.atZone(zone).toInstant();
	        return instant.toEpochMilli();
	    }
	
	    /**
	     * 默认东八区
	     *
	     * @param timestamp
	     * @return
	     */
	    public static LocalDateTime getLocalDateTime(Long timestamp) {
	        return LocalDateTime.ofEpochSecond(timestamp, 0, ZoneOffset.ofHours(8));
	    }
	
	    /**
	     * 将秒转为时间字符串
	     *
	     * @param timestamp
	     * @param timeFormat
	     * @return
	     */
	    public static String secondToLocalDateTimeString(Long timestamp, String timeFormat) {
	        return getTimeString(getLocalDateTime(timestamp * 1000), timeFormat);
	    }
	
	    /**
	     * 将秒转为时间字符串(使用默认时间格式)
	     *
	     * @param timestamp
	     * @return
	     */
	    public static String secondToLocalDateTimeString(Long timestamp) {
	        return timestamp == null ? null : getTimeString(getLocalDateTime(timestamp / 1000), defaultTimeFormat);
	    }
	
	
	    /**
	     * 获取秒级时间值
	     *
	     * @param time
	     * @return
	     */
	    public static Long getTimeToSecond(String time) {
	        return StringUtils.isBlank(time) ? null:getTimeToMillisecond(time) / 1000;
	    }
	
	    /**
	     * 获取毫秒级时间值
	     *
	     * @param time
	     * @return
	     */
	    public static long getTimeToMillisecond(String time) {
	        return getTime(time, defaultTimeFormat);
	    }
	
	
	    /**
	     * 字符串时间转LocalDateTime
	     *
	     * @param time
	     * @param format
	     * @return
	     */
	    public static LocalDateTime parse(String time, String format) {
	        DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
	        return LocalDateTime.parse(time, df);
	    }
	
	    /**
	     * 根据对应格式获取对应时间值
	     *
	     * @param time
	     * @param format
	     * @return
	     */
	    public static long getTime(String time, String format) {
	        LocalDateTime dateTime = null;
	        try {
	            dateTime = parse(time, format);
	        } catch (Exception e) {
	            e.printStackTrace();
	            log.error("时间格式化错误, 参数为:{}, 格式为:{}, 错误信息为:", time, format, e.getMessage());
	        }
	        return getTimestamp(dateTime);
	    }
	
	    /**
	     * 获取固定间隔时刻集合
	     *
	     * @param startTime  开始时间
	     * @param endTime    结束时间
	     * @param interval   时间间隔(单位:分钟)
	     * @param timeFormat 时间格式
	     * @return
	     */
	    public static List<Map<String, String>> getIntervalTimeList(String startTime, String endTime, long interval, String timeFormat) {
	        LocalDateTime startLocalDateTime = getLocalDateTime(startTime, timeFormat);
	        LocalDateTime endLocalDateTime = getLocalDateTime(endTime, timeFormat);
	        List<Map<String, String>> intervalTimeList = new ArrayList<>();
	        while (startLocalDateTime.isBefore(endLocalDateTime)) {
	            Map<String, String> intervalTimeMap = new LinkedHashMap<>(2);
	            // startTime
	            intervalTimeMap.put(CommonConstants.START_TIME, getTimeString(startLocalDateTime, timeFormat));
	            LocalDateTime tempLocalDateTime = startLocalDateTime.plusMinutes(interval);
	            // endTime
	            intervalTimeMap.put(CommonConstants.END_TIME, getTimeString(tempLocalDateTime.isBefore(endLocalDateTime) ? tempLocalDateTime:endLocalDateTime, timeFormat));
	            intervalTimeList.add(intervalTimeMap);
	            startLocalDateTime = tempLocalDateTime;
	        }
	        return intervalTimeList;
	    }
	
	    /**
	     * 获取固定间隔时刻集合
	     *
	     * @param startTime 开始时间
	     * @param endTime   结束时间
	     * @param interval  时间间隔(单位:分钟)  其他单位待优化
	     * @return
	     */
	    public static List<Map<String, String>> getIntervalTimeList(String startTime, String endTime, long interval) {
	        return getIntervalTimeList(startTime, endTime, interval, defaultTimeFormat);
	    }
	
	    /**
	     * 获取时间间隔
	     *
	     * @param startTime
	     * @param endTime
	     * @return
	     */
	    public static Long getMinuteInterval(LocalDateTime startTime, LocalDateTime endTime) {
	        Duration duration = Duration.between(startTime, endTime);
	        return duration.toMinutes();
	    }
	
	
	    public static void main(String[] args) {
	        List<Map<String, String>> intervalTimeList = getIntervalTimeList("2021-04-04 12:00:00", "2021-04-05 20:30:00", 60, defaultTimeFormat);
	
	        intervalTimeList.forEach(System.out::println);
	    }
	
	}

三. 后语:

此工具类,后期有时间会继续拓展维护。

package com.aapoint.util; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; public class LocalDateTimeUtil { /** * 比较 localDateTime2 是否在localDateTime1之前(比较大小) * @param localDateTime1 * @param localDateTime2 * @return */ public static Boolean compare(LocalDateTime localDateTime1,LocalDateTime localDateTime2){ return localDateTime1.isBefore(localDateTime2); } /** * 获取当前月份前/后的月份的第一天 * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String firstDay(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,0,i); //获取该月份的第一天 String firstDay = date.with(TemporalAdjusters.firstDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // System.out.println("第一天为:"+firstDay); return firstDay; } /** * 获取当前月份前/后的月份的最后一天 * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String lastDay(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,0,i); //获取该月份的最后一天 String lastDay = date.with(TemporalAdjusters.lastDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // System.out.println("最后一天为:"+lastDay); return lastDay; } /** * 获取当时间前/后的时间(天) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainDay(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,1,i); //获取天 String day = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // System.out.println("获取的时间为(天):"+day); return day; } /** * 获取当时间前/后的时间(小时) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainHours(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,2,i); //获取该月份的最后一天 String hours = date.format(DateTimeFormatter.ofPattern("HH:mm:ss")); // System.out.println("获取的时间为(小时):"+hours); return hours; } /** * 获取当时间前/后的时间(小时) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainMinutes(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,3,i); //获取该月份的最后一天 String minutes = date.format(DateTimeFormatter.ofPattern("HH:mm:ss")); // System.out.println("获取的时间为(分钟):"+minutes); return minutes; } /** * 获取当时间前/后的时间(小时) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainSeconds(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,4,i); //获取该月份的最后一天 String seconds = date.format(DateTimeFormatter.ofPattern("HH:mm:ss")); // System.out.println("获取的时间为(秒):"+seconds); return seconds; } public static void main(String[] args) { System.out.println("当前时间为:"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); System.out.println("前一个月份的第一天为:"+LocalDateTimeUtil.firstDay(1,1)); System.out.println("前一个月份的最后一天为:"+LocalDateTimeUtil.lastDay(1,1)); System.out.println("当前时间的前一天为:"+LocalDateTimeUtil.obtainDay(1,1)); System.out.println("当前时间的后一天为:"+LocalDateTimeUtil.obtainDay(2,1)); System.out.println("当前时间的前一小时为:"+LocalDateTimeUtil.obtainHours(1,1)); System.out.println("当前时间的后一小时为:"+LocalDateTimeUtil.obtainHours(2,1)); System.out.println("当前时间的前一分钟为:"+LocalDateTimeUtil.obtainMinutes(1,1)); System.out.println("当前时间的后一分钟为:"+LocalDateTimeUtil.obtainMinutes(2,1)); System.out.println("当前时间的前一秒为:"+LocalDateTimeUtil.obtainSeconds(1,1)); System.out.println("当前时间的后一秒为:"+LocalDateTimeUtil.obtainSeconds(2,1)); } private static LocalDateTime getLocalDateTime(Integer state,Integer type,Integer i) { LocalDateTime date; if(state == 0){ date = LocalDateTime.now(); }else if(state == 1){ if(type == 0) { //获取月 date = LocalDateTime.now().minusMonths(i); }else if(type == 1){ //获取天 date = LocalDateTime.now().minusDays(i); }else if(type == 2){ //获取小时 date = LocalDateTime.now().minusHours(i); }else if(type == 3){ //获取分钟 date = LocalDateTime.now().minusMinutes(i);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值