通过时间格式生成唯一编码以及日期常用方法


写项目的时候,很费劲写了一大堆,最后大哥优化,直接调用工具类,觉得是一个很不错的东西,留存一下,方便之后使用查找。

日期常用方法

package org.autumn.code;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalField;
import java.time.temporal.WeekFields;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * @Description: 日期常用方法
 * @Author: Zhangyuhan
 * @Date: 2022/4/19
 */
public class DateUtil {

    /**
     * 设置时区
     */
    public static final ZoneId ZONEID = ZoneId.systemDefault();

    /**
     * yyyy-MM-dd HH
     */
    public static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH";

    /**
     * yyyy-MM-dd
     */
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    /**
     * yyyyMMdd
     */
    public static final String YYYYMMDD = "yyyyMMdd";

    /**
     * yyyyMM
     */
    public static final String YYYYMM = "yyyyMM";
    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    /**
     * yyyyMMddHHmmss
     */
    public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public enum DateUtilEnum{
        /**
         * 	年
         */
        YEAR,
        /**
         * 	月
         */
        MONTH,
        /**
         *	 日
         */
        DAY,
        /**
         * 	周
         */
        WEEK,
        /**
         * 	小时
         */
        HOUR,
        /**
         * 	分钟
         */
        MINUTE,
        /**
         * 	秒
         */
        SECOND,
        /**
         * 	毫秒
         */
        MILLI,
        /**
         * 	微秒
         */
        MICRO,
        /**
         * 	纳秒
         */
        NANO
    }

    /**
     * timestamp to LocalDateTime
     * @param timestamp
     * @return
     */
    public static LocalDateTime timestampToDatetime(long timestamp){
        Instant instant = Instant.ofEpochMilli(timestamp);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }


    /**
     * Description: 获取当前年月 yyyyMM
     *
     * @return
     */
    public static String getYearAndMonth() {
        return DateTimeFormatter.ofPattern(YYYYMM).format(LocalDate.now());
    }

    /**
     * Description: yyyyMM
     *
     * @param timeStamp 时间戳
     * @return
     */
    public static String getYearAndMonth(long timeStamp) {
        return DateTimeFormatter.ofPattern(YYYYMM)
                .format(Instant.ofEpochMilli(timeStamp).atZone(ZONEID));
    }
    /**
     * 时间戳转字符串时间格式 yyyy-MM-dd HH:mm:ss
     * @param timeStamp
     * @return
     */
    public static String getDateTime(long timeStamp) {
        return DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS)
                .format(Instant.ofEpochMilli(timeStamp).atZone(ZONEID));
    }

    /**
     * 时间戳转LocalDateTime
     * @param timeStamp
     * @return
     */
    public static LocalDateTime toLocalDateTime(long timeStamp) {
        return Instant.ofEpochMilli(timeStamp).atZone(ZONEID).toLocalDateTime();
    }

    /**
     * LocalDateTime转时间戳
     * @param
     * @return
     */
    public static long toTimeStamp(LocalDateTime dateTime) {
        return dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    /**
     * 时间戳转LocalDate
     * @param timeStamp
     * @return
     */
    public static LocalDate toLocalDate(long timeStamp) {
        return Instant.ofEpochMilli(timeStamp).atZone(ZONEID).toLocalDate();
    }

    /**
     *
     * Description: 获取当前是几几年 是哪个月  是一个月中的第几天
     *
     * @param node
     * @return
     */
    public static int peridCount(String node) {
        LocalDateTime ldt = LocalDateTime.now();
        if ("day".equals(node)) {
            return ldt.getDayOfMonth();
        } else if ("month".equals(node)) {
            return ldt.getMonthValue();
        } else if ("year".equals(node)) {
            return ldt.getYear();
        } else {
            return 0;
        }
    }

    /**
     * -获取当前日期
     *
     * @return yyyy-MM-dd
     */
    public static String getNowDate() {
        return String.valueOf(LocalDate.now());
    }

    /**
     * -获取当前时间
     *
     * @return yyyyMMddHHmmss
     */
    public static String getNowDateTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(YYYYMMDDHHMMSS));
    }

    /**
     * -获取当前日期
     *
     * @return yyyyMMdd
     */
    public static String getNowDates() {
        return LocalDate.now().format(DateTimeFormatter.ofPattern(YYYYMMDD));
    }

    /**
     * -获取当前日期
     *
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getNowDateTimes() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));
    }

    /**
     * -获取当前日期 Description: getNowDateTime
     *
     * @param format 日期格式 yyyyMMddHHmmss yyyy-MM-dd ...
     * @return
     */
    public static String getNowDateTime(String format) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.now().format(formatter);
    }

    /**
     *
     * Description: 指定日期格式化
     *
     * @param date
     * @param formatter
     * @return
     */
    public static String getLocalDateStr(Date date, String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        Instant instant = date.toInstant();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZONEID);
        return dateTimeFormatter.format(localDateTime);
    }

    /**
     *
     * Description: dateToLocalDate
     * @param date
     * @return
     */
    public static LocalDate dateToLocalDate(Date date) {
        Instant instant = date.toInstant();
        return LocalDateTime.ofInstant(instant, ZONEID).toLocalDate();
    }

    /**
     *
     * Description: dateA = dateB
     * @param dateA 2021-10-16
     * @param dateB 2021-10-16
     */
    public static boolean beEqualTo(LocalDate dateA,LocalDate dateB) {
        return dateA.isEqual(dateB);
    }

    /**
     *
     * Description: dateA < dateB
     * @param dateA 2021-10-15
     * @param dateB 2021-10-16
     */
    public static boolean lessThan(LocalDate dateA,LocalDate dateB) {
        return dateA.isBefore(dateB);
    }

    /**
     *
     * Description: dateA <= dateB
     * @param dateA 2021-10-15
     * @param dateB 2021-10-16
     * @return
     */
    public static boolean lessThanOrEqual(LocalDate dateA,LocalDate dateB) {
        return dateA.isBefore(dateB) || dateA.isEqual(dateB);
    }

    /**
     *
     * Description: dateA > dateB
     * @param dateA 2021-10-16
     * @param dateB 2021-10-15
     */
    public static boolean greaterThan(LocalDate dateA,LocalDate dateB) {
        return dateA.isAfter(dateB);
    }

    /**
     *
     * Description: dateA >= dateB
     * @param dateA 2021-10-16
     * @param dateB 2021-10-15
     * @return
     */
    public static boolean greaterThanOrEqual(LocalDate dateA,LocalDate dateB) {
        return dateA.isAfter(dateB) || dateA.isEqual(dateB);
    }

    /**
     *
     * Description: 指定日期格式化
     *
     * @param date
     * @param formatter
     * @return
     */
    public static String getLocalDateStr(String date, String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        LocalDateTime localDateTime = LocalDateTime.parse(date);
        return dateTimeFormatter.format(localDateTime);
    }


    /**
     * 字符串时间转日期
     * @param date
     * @param formatter
     * @return
     */
    public static LocalDate getLocalDate(String date, String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        return LocalDate.parse(date,dateTimeFormatter);
    }

    /**
     * 	计算两个日期之间相差小时数
     * @param startDateTime
     * @param endDateTime
     * @param formatter 对应的字符串日期格式
     * @return
     */
    public static long betweenHours(String startDateTime, String endDateTime, String formatter) {
        return between(startDateTime, endDateTime,formatter,DateUtilEnum.HOUR);
    }

    /**
     * 	计算两个日期之间相差小时数
     * @param startDateTime
     * @param endDateTime
     * @param formatter 对应的字符串日期格式
     * @return
     */
    public static long betweenDays(String startDateTime, String endDateTime, String formatter) {
        return between(startDateTime, endDateTime,formatter,DateUtilEnum.DAY);
    }

    /**
     * 	计算两个日期之间相差值
     * @param startDateTime
     * @param endDateTime
     * @param formatter
     * @param dateUtilEnum
     * @return
     */
    public static long between(String startDateTime, String endDateTime, String formatter,DateUtilEnum dateUtilEnum) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        LocalDateTime startTime = LocalDateTime.parse(startDateTime,dateTimeFormatter);
        LocalDateTime endTime = LocalDateTime.parse(endDateTime,dateTimeFormatter);
        switch (dateUtilEnum) {
            case DAY:
                return ChronoUnit.DAYS.between(startTime, endTime);
            case HOUR:
                return ChronoUnit.HOURS.between(startTime, endTime);
            case SECOND:
                return ChronoUnit.SECONDS.between(startTime, endTime);
            case WEEK:
                return ChronoUnit.WEEKS.between(startTime, endTime);
            case YEAR:
                return ChronoUnit.YEARS.between(startTime, endTime);
            default:
                break;
        }
        return 0;
    }

    /**
     * 	计算两个日期之间相差周数
     * @param startDateTime
     * @param endDateTime
     * @param formatter
     * @return
     */
    public static long betweenWeeks(String startDateTime, String endDateTime, String formatter) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatter);
        LocalDateTime startTime = LocalDateTime.parse(startDateTime,dateTimeFormatter);
        LocalDateTime endTime = LocalDateTime.parse(endDateTime,dateTimeFormatter);
        return ChronoUnit.WEEKS.between(startTime, endTime);
    }

    /**
     * -计算两个日期之间相差天数 Description: betweenDate
     *
     * @param startDate
     * @param endDate
     * @return
     */
    public static int betweenDate(String startDate, String endDate) {
        return (int) (LocalDate.parse(endDate).toEpochDay() - LocalDate.parse(startDate).toEpochDay());
    }

    /**
     * Description: 计算两个日期之间相差天数
     *
     * @param startDate
     * @param endDate
     * @return
     */
    public static int betweenDate(Date startDate, Date endDate) {
        if (null != startDate && null != endDate) {
            LocalDate endLocalDate = endDate.toInstant().atZone(ZONEID).toLocalDate();
            LocalDate startLocalDate = startDate.toInstant().atZone(ZONEID).toLocalDate();
            return (int) (endLocalDate.toEpochDay() - startLocalDate.toEpochDay());
        } else {
            return -1;
        }
    }
    /**
     * 获取时间分割
     *
     * 0 今年的开始时间和结束时间
     * 1 本月的开始时间和结束时间
     * 2 本周的开始时间和结束时间
     */
    public static Map<String,String> getTimeSplit(int splitType){
        Map<String,String> resultMap = new HashMap<>(16);
        LocalDateTime localDateTime = LocalDateTime.now();
        LocalDateTime startTime =  null;
        LocalDateTime endTime = null;
        switch (splitType){
            //本年
            case 0 :
                startTime = LocalDateTime.of(LocalDate.from(localDateTime.with(TemporalAdjusters.firstDayOfYear())),LocalTime.MIN);

                endTime = LocalDateTime.of(LocalDate.from(localDateTime.with(TemporalAdjusters.lastDayOfYear())),LocalTime.MAX);

                break;
            //本月
            case 1 :
                startTime = LocalDateTime.of(LocalDate.from(localDateTime.with(TemporalAdjusters.firstDayOfMonth())),LocalTime.MIN);

                endTime = LocalDateTime.of(LocalDate.from(localDateTime.with(TemporalAdjusters.lastDayOfMonth())),LocalTime.MAX);

                break;
            //本周
            default:
                TemporalField temporalField = WeekFields.of(Locale.FRANCE).dayOfWeek();
                int value = 1;
                startTime = LocalDateTime.of(LocalDate.from(localDateTime.with(temporalField, value)),LocalTime.MIN);
                value = 7;
                endTime = LocalDateTime.of(LocalDate.from(localDateTime.with(temporalField, value)),LocalTime.MAX);
                break;
        }
        resultMap.put("endTime",endTime.format(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS)));
        resultMap.put("startTime",startTime.format(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS)));
        return resultMap;

    }

    /**
     * 获取一天中的时间(从当前时间开始递减)
     * @param hours
     * @return
     */
    public static String[] getTimeOfDay(int hours){
        String[] hoursString = new String[hours];
        LocalDateTime now = LocalDateTime.now();
        hoursString[0] = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00"));
        for (int i = 1; i < hoursString.length; i++) {
            LocalDateTime newTime = now.minusHours(i);
            hoursString[i] = newTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00"));
        }
        return hoursString;
    }

    /**
     * 获取多天中的日期(从当前日期开始递减)
     * @param days
     * @return
     */
    public static String[] getDateInMultipleDay(int days){
        String[] daysString = new String[days];
        LocalDateTime now = LocalDateTime.now();
        daysString[0] = now.format(DateTimeFormatter.ofPattern(YYYY_MM_DD));
        for (int i = 1; i < daysString.length; i++) {
            LocalDateTime newTime = now.minusDays(i);
            daysString[i] = newTime.format(DateTimeFormatter.ofPattern(YYYY_MM_DD));
        }
        return daysString;
    }

}

根据所传入的日期格式 生成唯一编码

package org.autumn.code;

/**
 * @Description:根据所传入的日期格式 生成唯一编码
 * @Author: Zhangyuhan
 * @Date: 2022/4/19
 */
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class NoUtil {
    private static Integer index = 1;
    private static ReadWriteLock lock = new ReentrantReadWriteLock();

    private NoUtil() {
    }

    private static int incr() {
        int var5;
        try {
            lock.writeLock().lock();
            if (index >= 9999) {
                index = 1;
            }

            Integer var0 = index;
            index = index + 1;
            var5 = var0;
        } finally {
            lock.writeLock().unlock();
        }

        return var5;
    }

    public static String generate(NoUtil.Type type) throws Exception {
        return generate(type, NoUtil.Model.TIMESTAMP);
    }

    /**
     * @Description: 根据所传格式 格式化时间
     * @Param: DateTimeFormatter
     */
    public static String format(DateTimeFormatter pattern) {
        return LocalDateTime.now().format(pattern);
    }

    public static String generate(NoUtil.Type type, NoUtil.Model model) throws Exception {
        switch(model) {
            case DATE:
                String date = format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                return type.prefix() + date + String.format("%04d", incr());
            case DATE_TIME:
                String dateTime = format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
                return type.prefix() + dateTime + String.format("%04d", incr());
            case TIMESTAMP:
                return type.prefix() + LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)) + String.format("%04d", incr());
            default:
                throw new Exception("未知构建模式!");
        }
    }

    @Override
    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof NoUtil)) {
            return false;
        } else {
            NoUtil other = (NoUtil)o;
            return other.canEqual(this);
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof NoUtil;
    }

    @Override
    public int hashCode() {
        boolean result = true;
        return 1;
    }

    @Override
    public String toString() {
        return "NoUtil()";
    }

    public static enum Model {
        DATE,
        DATE_TIME,
        TIMESTAMP;

        private Model() {
        }
    }

    public interface Type {
        String prefix();
    }
}

测试唯一编码生成

package org.autumn.code;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 测试编号
 * @Author: Zhangyuhan
 * @Date: 2022/4/19
 */
@Slf4j
public class NumTest {
    public static void main(String[] args) throws Exception {
        //时间戳
        log.info("时间戳+编号--生成的编码为{}", NoUtil.generate(CodeType.codeOne, NoUtil.Model.TIMESTAMP));
        log.info("--------------------------");
        //Date
        log.info("年月日+编号--生成的编码为{}", NoUtil.generate(CodeType.codeOne, NoUtil.Model.DATE));
        log.info("--------------------------");
        //DATE_TIME 年月日时分秒 +编号
        log.info("年月日时分秒+编号--生成的编码为{}", NoUtil.generate(CodeType.codeOne, NoUtil.Model.DATE_TIME));
    }
}


//定义枚举类 给出类型
enum CodeType implements NoUtil.Type {
    codeOne("A");

    CodeType(String prefix) {
        this.prefix = prefix;
    }

    @Getter
    private String prefix;

    @Override
    public String prefix() {
        return this.prefix;
    }

}

测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值