乐趣区

关于java:Java-时间工具类-总结

Date 类

Date():空参数结构,会以以后操作系统的工夫结构一个 Date 对象。
long getTime():获取到从 1970 年开始,到这个 Date 对象示意的工夫,过了多少毫秒,返回工夫戳

public static void dateApi() {Date d1 = new Date();
    System.out.println(d1); //Mon Jul 19 20:42:57 CST 2021
    System.out.println(d1.getTime()); //1626698635074

}

Date 日期类型的大小比拟

办法一:java.util.Date 类实现了 Comparable 接口,能够间接调用 Date 的 compareTo()办法来比拟大小

String beginTime = "2018-07-28 14:42:32";
String endTime = "2018-07-29 12:26:32";
 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
try {Date date1 = format.parse(beginTime);
    Date date2 = format.parse(endTime);
    
    int compareTo = date1.compareTo(date2);
    
    System.out.println(compareTo);
    
} catch (ParseException e) {e.printStackTrace();
}

compareTo()办法的返回值,date1 小于 date2 返回 -1,date1 大于 date2 返回 1,相等返回 0

办法二:通过 Date 自带的 before()或者 after()办法比拟

String beginTime = "2018-07-28 14:42:32";
String endTime = "2018-07-29 12:26:32";
 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
try {Date date1 = format.parse(beginTime);
    Date date2 = format.parse(endTime);
    
    boolean before = date1.before(date2);
    
    System.out.println(before);
    
} catch (ParseException e) {e.printStackTrace();
}

before()或者 after()办法的返回值为 boolean 类型

办法三:通过调用 Date 的 getTime()办法获取到毫秒数来进行比拟

String beginTime = "2018-07-28 14:42:32";
String endTime = "2018-07-29 12:26:32";
 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
try {Date date1 = format.parse(beginTime);
    Date date2 = format.parse(endTime);
    
    long beginMillisecond = date1.getTime();
    long endMillisecond = date2.getTime();
    
    System.out.println(beginMillisecond > endMillisecond);
    
} catch (ParseException e) {e.printStackTrace();
}

Calendar 类

Calendar 提供了很不便的不同日期格局的解决

public static void main(String[] args) {System.out.println("------------Calendar 无参结构 ------------");
    //Calendar 对象,不传参数,默认为以后日期
    Calendar calendar =new GregorianCalendar();
    // 获取以后年份
    System.out.println(calendar.get(Calendar.YEAR));
    // 获取以后月份 从 0 开始,0 代表一月,1 代表二月,以此类推
    System.out.println(calendar.get(Calendar.MONTH));
    // 获取以后日期 也能够应用 DAY_OF_MONTH
    System.out.println(calendar.get(Calendar.DATE));
    // 获取以后时 24 小时进制
    System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
    // 获取以后分
    System.out.println(calendar.get(Calendar.MINUTE));
    // 获取以后秒
    System.out.println(calendar.get(Calendar.SECOND));

    // 获取明天是这个月的第几个星期
    System.out.println(calendar.get(Calendar.WEEK_OF_MONTH));
    // 获取明天是星期几  1 示意星期天,2 示意星期一,以此类推
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));


    System.out.println("------------Calendar 有参结构 ------------");
    /**
         * 有参结构 别离代表年月日时分秒,写法简单明了,很合乎咱们人类的思维
         * 留神月份的设置是从 0 开始的,这里设置的是月份是 6,理论是设置了 7 月份
         */
    calendar =new GregorianCalendar(2019, 6, 14, 16, 15,30);
    /**
         * 除了在构造方法间接设置之外,也能够通过 set 办法设置
         * 第一个参数示意设置的参数类型,第二个示意具体值
         */
    calendar.set(Calendar.YEAR, 2000);
    calendar.set(Calendar.MONTH, 0);
    calendar.set(Calendar.DATE, 20);
    //...


    System.out.println("------------Calendar 和 Date 转换 ------------");
    Date now = calendar.getTime();
    calendar.setTime(now);


    System.out.println("------------Calendar 日期计算以及判断 ------------");
    calendar = new GregorianCalendar();
    Calendar calendar2 = new GregorianCalendar();
    calendar2.set(Calendar.YEAR, 2800);
    // 是否在某个工夫 (calendar2) 之后
    System.out.println(calendar.after(calendar2));
    // 是否在某个工夫 (calendar2) 之前
    System.out.println(calendar.before(calendar2));
    // 减少多少年年,月日以及时分秒同理
    calendar.add(Calendar.YEAR, -10);

}

Time 类

java.time 包中的是类是不可变且线程平安的。
●Instant——它代表的是工夫戳
●LocalDate——不蕴含具体工夫的日期,比方 2014-01-14。它能够用来存储生日,周年纪念日,入职日期等。
●LocalTime——它代表的是不含日期的工夫
●LocalDateTime——它蕴含了日期及工夫,不过还是没有偏移信息或者说时区。
●ZonedDateTime——这是一个蕴含时区的残缺的日期工夫,偏移量是以 UTC/ 格林威治工夫为基准的。

/**
1.LocalDateTime 相较于 LocalDate、LocalTime,应用频率要高
2. 相似于 Calendar
*/


//now(): 获取以后的日期、工夫、日期 + 工夫
LocalDate localDate = LocalDate.now();  //2021-02-04
LocalTime localTime = LocalTime.now();  //10:11:34.741
LocalDateTime localDateTime = LocalDateTime.now();  //2021-02-04T10:11:34.768

//of(): 设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
System.out.println(localDateTime1);  //2020-10-06T13:23:43

//getXxx():获取相干的属性
System.out.println(localDateTime.getDayOfMonth()); //4 日期
System.out.println(localDateTime.getDayOfWeek());  //THURSDAY 星期
System.out.println(localDateTime.getMonth());       //FEBRUARY 月份    
System.out.println(localDateTime.getMonthValue()); //2 月份
System.out.println(localDateTime.getMinute());     //12 分


// 体现不可变性
//withXxx(): 设置相干的属性
LocalDate localDate1 = localDate.withDayOfMonth(22);
System.out.println(localDate);  //2021-02-04
System.out.println(localDate1); //2021-02-22


LocalDateTime localDateTime2 = localDateTime.withHour(4);
System.out.println(localDateTime);
System.out.println(localDateTime2);

// 不可变性
LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
System.out.println(localDateTime);
System.out.println(localDateTime3);

LocalDateTime localDateTime4 = localDateTime.minusDays(6);
System.out.println(localDateTime);
System.out.println(localDateTime4);

java.sql.Timestamp:工夫戳,适配于 SQL 中的 TIMESTAMP 类型而呈现的,准确到纳秒级别。

DateFormat 类 与 SimpleDateFormat 类

DateFormat 类和 SimpleDateFormat 类来格式化日期
DateFormat 位于 text 包中,它是一个抽象类,不能被实例化
DateFormat 类是 SimpleDateFormat 类父类
SimpleDateFormat 是一个以与语言环境无关的形式来格式化和解析日期的具体类。它容许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

应用样例

// 工夫格式化
DateFormat tf1 = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
DateFormat tf2 = DateFormat.getTimeInstance(DateFormat.LONG, Locale.CHINA);
DateFormat tf3 = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat tf4 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.CHINA);
String t1 = tf1.format(new Date());
String t2 = tf2.format(new Date());
String t3 = tf3.format(new Date());
String t4 = tf4.format(new Date());

// 日期格式化
DateFormat df1 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
DateFormat df2 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat df4 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.CHINA);
String d1 = df1.format(new Date());
String d2 = df2.format(new Date());
String d3 = df3.format(new Date());
String d4 = df4.format(new Date());

// 输入日期
System.err.println(d1 + "|eguid|" + t1);
System.err.println(d2 + "|eguid|" + t2);
System.err.println(d3 + "|eguid|" + t3);
System.err.println(d4 + "|eguid|" + t4);

后果
2018 年 10 月 15 日 |eguid| 星期一 上午 09 时 30 分 43 秒 CST
2018 年 10 月 15 日 |eguid| 上午 09 时 30 分 43 秒
2018-10-15 |eguid| 9:30:43
18-10-15 |eguid| 上午 9:30

import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @auother eguid
*/
public class DateTest {public static void main(String[] args) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 点 mm 分 ss 秒");
        System.err.println(sdf.format(new Date())); // 格式化以后日期工夫
    }
}


2018 年 10 月 15 日 09 点 26 分 23 秒

DateFormatUtils 类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.apache.commons.lang.time;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class DateFormatUtils {public static final FastDateFormat ISO_DATETIME_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss");
    public static final FastDateFormat ISO_DATETIME_TIME_ZONE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ");
    public static final FastDateFormat ISO_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd");
    public static final FastDateFormat ISO_DATE_TIME_ZONE_FORMAT = FastDateFormat.getInstance("yyyy-MM-ddZZ");
    public static final FastDateFormat ISO_TIME_FORMAT = FastDateFormat.getInstance("'T'HH:mm:ss");
    public static final FastDateFormat ISO_TIME_TIME_ZONE_FORMAT = FastDateFormat.getInstance("'T'HH:mm:ssZZ");
    public static final FastDateFormat ISO_TIME_NO_T_FORMAT = FastDateFormat.getInstance("HH:mm:ss");
    public static final FastDateFormat ISO_TIME_NO_T_TIME_ZONE_FORMAT = FastDateFormat.getInstance("HH:mm:ssZZ");
    public static final FastDateFormat SMTP_DATETIME_FORMAT;

    public DateFormatUtils() {}

    public static String formatUTC(long millis, String pattern) {return format((Date)(new Date(millis)), pattern, DateUtils.UTC_TIME_ZONE, (Locale)null);
    }

    public static String formatUTC(Date date, String pattern) {return format((Date)date, pattern, DateUtils.UTC_TIME_ZONE, (Locale)null);
    }

    public static String formatUTC(long millis, String pattern, Locale locale) {return format(new Date(millis), pattern, DateUtils.UTC_TIME_ZONE, locale);
    }

    public static String formatUTC(Date date, String pattern, Locale locale) {return format(date, pattern, DateUtils.UTC_TIME_ZONE, locale);
    }

    public static String format(long millis, String pattern) {return format((Date)(new Date(millis)), pattern, (TimeZone)null, (Locale)null);
    }

    public static String format(Date date, String pattern) {return format((Date)date, pattern, (TimeZone)null, (Locale)null);
    }

    public static String format(Calendar calendar, String pattern) {return format((Calendar)calendar, pattern, (TimeZone)null, (Locale)null);
    }

    public static String format(long millis, String pattern, TimeZone timeZone) {return format((Date)(new Date(millis)), pattern, timeZone, (Locale)null);
    }

    public static String format(Date date, String pattern, TimeZone timeZone) {return format((Date)date, pattern, timeZone, (Locale)null);
    }

    public static String format(Calendar calendar, String pattern, TimeZone timeZone) {return format((Calendar)calendar, pattern, timeZone, (Locale)null);
    }

    public static String format(long millis, String pattern, Locale locale) {return format((Date)(new Date(millis)), pattern, (TimeZone)null, locale);
    }

    public static String format(Date date, String pattern, Locale locale) {return format((Date)date, pattern, (TimeZone)null, locale);
    }

    public static String format(Calendar calendar, String pattern, Locale locale) {return format((Calendar)calendar, pattern, (TimeZone)null, locale);
    }

    public static String format(long millis, String pattern, TimeZone timeZone, Locale locale) {return format(new Date(millis), pattern, timeZone, locale);
    }

    public static String format(Date date, String pattern, TimeZone timeZone, Locale locale) {FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
        return df.format(date);
    }

    public static String format(Calendar calendar, String pattern, TimeZone timeZone, Locale locale) {FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
        return df.format(calendar);
    }

    static {SMTP_DATETIME_FORMAT = FastDateFormat.getInstance("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
    }
}

DateUtils 类

源码

package com.xinchacha.security.utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @ClassName DateUtils
 * @Description TODO
 * @Author yiGeXinDong
 * @Date 2020/5/11 9:53
 * @Version 1.0
 **/
public class DateUtils   {
    public final static int FORMAT_DEFAULT = 0; // 默认格局

    /** 日时字符串格局:长格局(如:年份用 4 位示意)*/
    public final static int FORMAT_LONG = 1; // 长格局(如:年份用 4 位示意)/** 日时字符串格局:短格局(如:年份用 2 位示意)*/
    public final static int FORMAT_SHORT = 2; // 短格局(如:年份用 2 位示意)/** 默认日期字符串格局 "yyyy-MM-dd" */
    public final static String DATE_DEFAULT = "yyyy-MM-dd";
    /** 日期字符串格局 "yyyy" */
    private final static String DATE_YYYY="yyyy";
    /** 日期字符串格局 "mm" */
    private final static String DATE_MM="mm";
    /** 日期字符串格局 "dd" */
    private final static String DATE_DD="dd";
    /** 日期字符串格局 "yyyyMM" */
    public final static String DATE_YYYYMM = "yyyyMM";

    /** 日期字符串格局 "yyyyMMdd" */
    public final static String DATE_YYYYMMDD = "yyyyMMdd";

    /** 日期字符串格局 "yyyy-MM" */
    public final static String DATE_YYYY_MM = "yyyy-MM";

    /** 日期字符串格局 "yyyy-MM-dd" */
    public final static String DATE_YYYY_MM_DD = "yyyy-MM-dd";

    /** 默认日时字符串格局 "yyyy-MM-dd HH:mm:ss" */
    public final static String DATETIME_DEFAULT = "yyyy-MM-dd HH:mm:ss";

    /** 日时字符串格局 "yyyy-MM-dd HH:mm" */
    public final static String DATETIME_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";

    /** 日时字符串格局 "yyyy-MM-dd HH:mm:ss" */
    public final static String DATETIME_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /** 日时字符串格局 "yyyy-MM-dd HH:mm:ss.SSS" */
    public final static String DATETIME_YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";

    /** 默认工夫字符串格局 "HH:mm:ss" */
    public final static String TIME_DEFAULT = "HH:mm:ss";

    /** 默认工夫字符串格局 "HH:mm" */
    public final static String TIME_HH_MM = "HH:mm";

    /** 默认工夫字符串格局 "HH:mm:ss" */
    public final static String TIME_HH_MM_SS = "HH:mm:ss";
    public static final long YEAR_NUMBER=365;
    /** 分 */
    public static final long MINUTE_TTL = 60 * 1000l;
    /** 时 */
    public static final long HOURS_TTL = 60 * 60 * 1000l;
    /** 半天 */
    public static final long HALF_DAY_TTL = 12 * 60 * 60 * 1000l;
    /** 天 */
    public static final long DAY_TTL = 24 * 60 * 60 * 1000l;
    /** 月 */
    public static final long MONTH_TTL = 30 * 24 * 60 * 60 * 1000l;



    /**
     * TODO 计算两个工夫差值
     * @param startDate,endDate
     * @Author XuWenXiao
     * @return int(两个工夫相差的天数)
     * @throws ParseException
     */
    public static int daysBetween(Date startDate, Date endDate) throws ParseException {Calendar calendar = Calendar.getInstance();
        calendar.setTime(startDate);
        long sTime = calendar.getTimeInMillis();
        calendar.setTime(endDate);
        long endTime = calendar.getTimeInMillis();
        long between_days=(endTime-sTime)/DAY_TTL;
        return Integer.parseInt(String.valueOf(between_days));
    }
    /**
     * TODO 获取以后零碎工夫
     * @Author XuWenXiao
     * @return Date
     */
    public static Date getNewDate(){SimpleDateFormat df = new SimpleDateFormat(DATETIME_YYYY_MM_DD_HH_MM_SS);// 设置日期格局
        Date newDate=null;
        try {newDate=df.parse(df.format(new Date()));
        } catch (ParseException e) {e.printStackTrace();
        }
        return newDate;
    }
    /**
     * 失去日期字符串 默认格局(yyyy-MM-dd)pattern 能够为:"yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, Object... pattern) {
        String formatDate = null;
        if (pattern != null && pattern.length > 0) {formatDate = DateFormatUtils.format(date, pattern[0].toString());
        } else {formatDate = DateFormatUtils.format(date, DATE_YYYY_MM_DD);
        }
        return formatDate;
    }
    /**
     * 失去以后年份字符串 格局(yyyy)*/
    public static String getYear() {return formatDate(new Date(), DATE_YYYY);
    }
    /**
     * 失去以后月份字符串 格局(MM)*/
    public static String getMonth() {return formatDate(new Date(), DATE_MM);
    }
    /**
     * 失去当天字符串 格局(dd)*/
    public static String getDay() {return formatDate(new Date(), DATE_DD);
    }
    /**
     * 获取以后工夫的字符串模式(例如;"201806291135")* @return 年月日时分
     */
    public static String getDateToString(){Calendar c = Calendar.getInstance();
        return getYear()+getMonth()+getDay()+c.get(Calendar.HOUR_OF_DAY)+c.get(Calendar.MINUTE);
    }
    /**
     * 获取过来的年数
     * @param date
     * @return
     */
    public static Long pastYear(Date date) {return date==null?null:pastDays(date)/YEAR_NUMBER;
    }

    /**
     * 获取过来的天数
     * @param date
     * @return
     */
    public static long pastDays(Date date) {long t = new Date().getTime()-date.getTime();
        return t/DAY_TTL;
    }

    /**
     * 获取过来的小时
     * @param date
     * @return
     */
    public static long pastHour(Date date) {long t = new Date().getTime()-date.getTime();
        return t/HOURS_TTL;
    }

    /**
     * 获取过来的分钟
     * @param date
     * @return
     */
    public static long pastMinutes(Date date) {long t = new Date().getTime()-date.getTime();
        return t/MINUTE_TTL;
    }
    /**
     * 获取两个日期之间的天数
     *
     * @param before
     * @param after
     * @return
     */
    public static double getDistanceOfTwoDate(Date before, Date after) {long beforeTime = before.getTime();
        long afterTime = after.getTime();
        return (afterTime - beforeTime) /DAY_TTL;
    }
    /**
     * 依据身份证计算出身日期
     *
     */
    /**
     * 通过身份证号码获取出生日期、性别、年齡
     * @param certificateNo
     * @return 返回的出生日期格局:1990-01-01   性别格局:2- 女,1- 男
     */
    public static Map<String, String> getBirAgeSex(String certificateNo) {System.out.println(certificateNo);
        String birthday = "";
        String age = "";
        String sexCode = "";
        int year = Calendar.getInstance().get(Calendar.YEAR);
        char[] number = certificateNo.toCharArray();
        boolean flag = true;
        if (number.length == 15) {for (int x = 0; x < number.length; x++) {if (!flag) return new HashMap<String, String>();
                flag = Character.isDigit(number[x]);
            }
        } else if (number.length == 18) {for (int x = 0; x < number.length - 1; x++) {if (!flag) return new HashMap<String, String>();
                flag = Character.isDigit(number[x]);
            }
        }
        if (flag && certificateNo.length() == 15) {birthday = "19" + certificateNo.substring(6, 8) + "-"
                    + certificateNo.substring(8, 10) + "-"
                    + certificateNo.substring(10, 12);
            sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 3, certificateNo.length())) % 2 == 0 ? "2" : "1";
            age = (year - Integer.parseInt("19" + certificateNo.substring(6, 8))) + "";
        } else {birthday = certificateNo.substring(6, 10) + "-"
                    + certificateNo.substring(10, 12) + "-"
                    + certificateNo.substring(12, 14);
            sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 4, certificateNo.length() - 1)) % 2 == 0 ? "2" : "1";
            age = (year - Integer.parseInt(certificateNo.substring(6, 10))) + "";
        }
        Map<String, String> map = new HashMap<String, String>();
        map.put("birthday", birthday);
        map.put("age", age);
        map.put("sexCode", sexCode);
        return map;
    }
    /**
     * 依据身份证的号码算出以后身份证持有者的年龄 18 位身份证
     * @author 黄涛
     * @return
     * @throws Exception
     */
    public static int getCarAge(String birthday){String year = birthday.substring(0, 4);// 失去年份
        String yue = birthday.substring(4, 6);// 失去月份
        //String day = birthday.substring(6, 8);//
        Date date = new Date();// 失去以后的零碎工夫
        SimpleDateFormat format = new SimpleDateFormat(DATE_YYYY_MM_DD);
        String fYear = format.format(date).substring(0, 4);// 以后年份
        String fYue = format.format(date).substring(5, 7);// 月份
        // String fday=format.format(date).substring(8,10);
        int age = 0;
        if (Integer.parseInt(yue) <= Integer.parseInt(fYue)) { // 以后月份大于用户出身的月份示意已过生
            age = Integer.parseInt(fYear) - Integer.parseInt(year) + 1;
        } else {// 以后用户还没过生
            age = Integer.parseInt(fYear) - Integer.parseInt(year);
        }
        return age;
    }
    /**
     *
     * 依据身份证获取性别
     */
    public static String getCarSex(String CardCode){
        String sex;
        if (Integer.parseInt(CardCode.substring(16).substring(0, 1)) % 2 == 0) {// 判断性别
            sex = "2";
        } else {sex = "1";}
        return sex;
    }



    /**
     * 依据传入的日历型日期,计算出执行的工夫值(准确版)* @param beginTime
     * @param endTime
     * @return
     */
    public static String countExecTimeToString_exact(Calendar beginTime,Calendar endTime)
    {// 计算两个日期类型之间的差值(单位:毫秒)Long timeDispersion = endTime.getTimeInMillis() - beginTime.getTimeInMillis();
        String tmpMsg = "耗时:";// 拼写输入的字符串
        int timeNum = 0;// 记录时间的数值(几小时、几分、几秒)if(timeDispersion >= (HOURS_TTL))// 判断是否足够一小时
        {// 若足够则计算有几小时
            timeNum = (int) (timeDispersion/HOURS_TTL);
            tmpMsg += timeNum + "时";// 拼写输入几小时
            timeDispersion = timeDispersion - (timeNum*HOURS_TTL);// 减去小时数(这样剩下的就是分钟数了)}
        if(timeDispersion >= (MINUTE_TTL))// 判断是否足够一分钟
        {// 若足够则计算有几分钟
            timeNum = (int) (timeDispersion/MINUTE_TTL);
            tmpMsg += timeNum + "分";// 拼写输入几分钟
            timeDispersion = timeDispersion - (timeNum*MINUTE_TTL);// 减去分钟数(这样就剩下秒数了)}
        if(timeDispersion >= 1000)// 判断是否足够一秒
        {// 若足够则计算几秒
            timeNum = (int) (timeDispersion/1000);
            tmpMsg +=  timeNum + "秒";// 拼写输入秒数
            timeDispersion = timeDispersion - timeNum*1000;// 减去秒数(这样就剩下毫秒数了)}
        tmpMsg += timeDispersion + "毫秒";// 拼写输入毫秒数
        return tmpMsg;

    }// 重载办法,返回 Long 类型(毫秒)public static Long countExecTimeToLong_exact(Calendar beginTime,Calendar endTime)
    {// 间接返回毫秒数
        return (endTime.getTimeInMillis() - beginTime.getTimeInMillis());
    }
    /**
     * 依据传入的 long 类型日期,计算出执行的工夫值(准确版)* @param beginTime
     * @param endTime
     * @return
     */
    public static String countExecTimeToString_exact(Long beginTime,Long endTime)
    {// 计算两个日期类型之间的差值(单位:毫秒)Long timeDispersion = endTime - beginTime;
        String tmpMsg = "耗时:";// 拼写输入的字符串
        int timeNum = 0;// 记录时间的数值(几小时、几分、几秒)if(timeDispersion >= (HOURS_TTL))// 判断是否足够一小时
        {// 若足够则计算有几小时
            timeNum = (int) (timeDispersion/(HOURS_TTL));
            tmpMsg += timeNum + "时";// 拼写输入几小时
            timeDispersion = timeDispersion - (timeNum*HOURS_TTL);// 减去小时数(这样剩下的就是分钟数了)}
        if(timeDispersion >= (MINUTE_TTL))// 判断是否足够一分钟
        {// 若足够则计算有几分钟
            timeNum = (int) (timeDispersion/(MINUTE_TTL));
            tmpMsg += timeNum + "分";// 拼写输入几分钟
            timeDispersion = timeDispersion - (timeNum*MINUTE_TTL);// 减去分钟数(这样就剩下秒数了)}
        if(timeDispersion >= 1000)// 判断是否足够一秒
        {// 若足够则计算几秒
            timeNum = (int) (timeDispersion/1000);
            tmpMsg +=  timeNum + "秒";// 拼写输入秒数
            timeDispersion = timeDispersion - timeNum*1000;// 减去秒数(这样就剩下毫秒数了)}
        tmpMsg += timeDispersion + "毫秒";// 拼写输入毫秒数
        return tmpMsg;

    }
    /**
     * 获取指定年度全副月份汇合 <br>
     * 格局为 yyyy-MM
     * @author 王鹏
     * @version 2019 年 11 月 16 日 下午 4:52:55
     * @param year 年度
     * @return
     */
    public static List<String> getYearMonthByYear(String year) {List<String> monthList =new ArrayList<>();
        for (int i = 1; i <= 12; i++) {monthList.add(year+"-"+(i<10?"0":"")+i);
        }
        return monthList;
    }

    /**
     * 获取下个月
     * dateStr 日期
     * format 格局:yyyy-MM 或 yyyyMM
     * @return
     */
    public static String getPreMonth(String dateStr,String format) {
        String preMonth = "";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date;
        try {date = sdf.parse(dateStr);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(calendar.MONTH, 1);
            sdf.format(calendar.getTime());

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();}
        return preMonth;
    }
    /**
     * 获取下个月
     * dateStr 日期
     * format 格局:yyyy-MM 或 yyyyMM
     * @return
     */
    public static String getPreMonthFormat(String dateStr,String format) {
        String preMonth = "";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date;
        try {date = sdf.parse(dateStr);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(calendar.MONTH, 1);
            preMonth= sdf.format(calendar.getTime());

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();}
        return preMonth;
    }
    /**
     * 日期比拟
     * date1 比 date2 大 true
     */
    public static boolean dateSize(String aDate,String bDate,SimpleDateFormat format) {
        boolean str = false;
        try {if(StringUtils.isNotBlank(aDate)&&StringUtils.isNotBlank(bDate)) {Date date1 = format.parse(aDate);
                Date date2 = format.parse(bDate);
                str = date1.after(date2);
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();}
        return str;
    }

}



自定义 DateUtil 类

package com.jd.survey.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DateUtil {private static final Logger log = LoggerFactory.getLogger(DateUtil.class);
    private static final String default_format = "yyyy-MM-dd HH:mm:ss";
    private static final String format_yyyy = "yyyy";
    private static final String format_yyyyMM = "yyyy-MM";
    private static final String format_yyyyMMdd = "yyyy-MM-dd";
    private static final String format_yyyyMMddHH = "yyyy-MM-dd HH";
    private static final String format_yyyyMMddHHmm = "yyyy-MM-dd HH:mm";
    private static final String format_yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss";
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;
    public static final int SUNDAY = 7;
    public static final int JANUARY = 1;
    public static final int FEBRUARY = 2;
    public static final int MARCH = 3;
    public static final int APRIL = 4;
    public static final int MAY = 5;
    public static final int JUNE = 6;
    public static final int JULY = 7;
    public static final int AUGUST = 8;
    public static final int SEPTEMBER = 9;
    public static final int OCTOBER = 10;
    public static final int NOVEMBER = 11;
    public static final int DECEMBER = 12;
    
    public static final Date parseDate(String strDate, String format) {
        SimpleDateFormat df = null;
        Date date = null;
        df = new SimpleDateFormat(format);

        try {date = df.parse(strDate);
        } catch (ParseException e) {}

        return (date);
    }

    public static Date now() {return new Date();
    }

    public static int getYear(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(1);
    }

    public static int getDayOfMonth(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(5);
    }

    public static int getMonthOfYear(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(2) + 1;
    }

    public static int getDayOfWeek(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.setFirstDayOfWeek(2);
        int day = calendar.get(7) - 1;
        if (day == 0) {day = 7;}
        return day;
    }

    public static Date getTodayEndTime(){Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY,23);
        calendar.set(Calendar.MINUTE,59);
        calendar.set(Calendar.SECOND,59);
        return calendar.getTime();}

    public static int getDayOfYear(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(6);
    }

    public static int getHourField(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(11);
    }

    public static int getMinuteField(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(12);
    }

    public static int getSecondField(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(13);
    }

    public static int getMillisecondField(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.get(14);
    }

    public static long getDays(Date datetime) {return datetime.getTime() / 86400000L;
    }

    public static long getHours(Date datetime) {return datetime.getTime() / 3600000L;
    }

    public static long getMinutes(Date datetime) {return datetime.getTime() / 60000L;
    }

    public static long getSeconds(Date datetime) {return datetime.getTime() / 1000L;
    }

    public static long getMilliseconds(Date datetime) {return datetime.getTime();
    }

    public static int getWeekOfMonth(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.setFirstDayOfWeek(2);
        return calendar.get(4);
    }

    public static int getWeekOfYear(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.setFirstDayOfWeek(2);
        return calendar.get(3);
    }

    public static int getMaxDateOfMonth(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.getActualMaximum(5);
    }

    public static int getMaxDateOfYear(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        return calendar.getActualMaximum(6);
    }

    public static int getMaxWeekOfMonth(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.setFirstDayOfWeek(2);
        return calendar.getActualMaximum(4);
    }

    public static int getMaxWeekOfYear(Date datetime) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.setFirstDayOfWeek(2);
        return calendar.getActualMaximum(3);
    }

    public static Date toDatetime(String datetimeString, String format) {
        Date result = null;
        try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
            result = simpleDateFormat.parse(datetimeString);
        } catch (Exception e) {log.error("Fail to parse datetime.", e);
        }
        return result;
    }

    public static String toString(Date datetime) {return toString(datetime, null);
    }

    public static String toString(Date datetime, String format) {
        String result = null;
        SimpleDateFormat simpleDateFormat = null;
        try {if (StringUtils.isNoneBlank(new CharSequence[] {format})) {simpleDateFormat = new SimpleDateFormat(format);
            } else {simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }
            result = simpleDateFormat.format(datetime);
        } catch (Exception e) {log.error("Fail to parse datetime.", e);
        }
        return result;
    }

    public static int diffYears(Date datetime1, Date datetime2) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime1);
        int month1 = calendar.get(1);
        calendar.setTime(datetime2);
        int month2 = calendar.get(1);
        return month1 - month2;
    }

    public static int diffMonths(Date datetime1, Date datetime2) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime1);
        int month1 = calendar.get(2);
        calendar.setTime(datetime2);
        int month2 = calendar.get(2);
        return month1 - month2;
    }

    public static long diffDays(Date datetime1, Date datetime2) {return (datetime1.getTime() - datetime2.getTime()) / 86400000L;
    }

    public static long diffDaysByCalendar(Date datetime1, Date datetime2)
            throws Exception {
        try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return diffDays(sdf.parse(sdf.format(datetime1)),
                    sdf.parse(sdf.format(datetime2)));
        } catch (Exception e) {throw e;}
    }

    public static long diffHours(Date datetime1, Date datetime2) {return (datetime1.getTime() - datetime2.getTime()) / 3600000L;
    }

    public static long diffMiniutes(Date datetime1, Date datetime2) {return (datetime1.getTime() - datetime2.getTime()) / 60000L;
    }

    public static long diffSeconds(Date datetime1, Date datetime2) {return (datetime1.getTime() - datetime2.getTime()) / 1000L;
    }

    public static Date add(Date datetime1, Date datetime2) {Calendar calendar = Calendar.getInstance();
        Date date = new Date(datetime1.getTime() + datetime2.getTime());
        return date;
    }

    public static Date minus(Date datetime1, Date datetime2) {Calendar calendar = Calendar.getInstance();
        Date date = new Date(datetime1.getTime() - datetime2.getTime());
        return date;
    }

    public static boolean isBefore(Date datetime1, Date datetime2) {return datetime2.getTime() - datetime1.getTime() > 0L;}

    public static boolean isBeforeOrEqual(Date datetime1, Date datetime2) {return datetime2.getTime() - datetime1.getTime() >= 0L;}

    public static boolean isEqual(Date datetime1, Date datetime2) {return datetime2.getTime() == datetime1.getTime();}

    public static boolean isAfter(Date datetime1, Date datetime2) {return datetime2.getTime() - datetime1.getTime() < 0L;}

    public static boolean isAfterOrEqual(Date datetime1, Date datetime2) {return datetime2.getTime() - datetime1.getTime() <= 0L;}

    public static Date addMilliseconds(Date datetime, int milliseconds) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.roll(14, milliseconds);
        return calendar.getTime();}

    public static Date addSeconds(Date datetime, int seconds) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.roll(13, seconds);
        return calendar.getTime();}

    public static Date addMinutes(Date datetime, int minutes) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.roll(12, minutes);
        return calendar.getTime();}

    public static Date addHours(Date datetime, int hours) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.roll(10, hours);
        return calendar.getTime();}

    public static Date addDays(Date datetime, int days) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.roll(5, days);
        return calendar.getTime();}

    public static Date addMonths(Date datetime, int months) {Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.roll(2, months);
        return calendar.getTime();}

    public static boolean isSameSecond(Date datetime1, Date datetime2) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(datetime1).equals(sdf.format(datetime2));
    }

    public static boolean isSameMinute(Date datetime1, Date datetime2) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return sdf.format(datetime1).equals(sdf.format(datetime2));
    }

    public static boolean isSameHour(Date datetime1, Date datetime2) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");
        return sdf.format(datetime1).equals(sdf.format(datetime2));
    }

    public static boolean isSameDay(Date datetime1, Date datetime2) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(datetime1).equals(sdf.format(datetime2));
    }

    public static boolean isSameMonth(Date datetime1, Date datetime2) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        return sdf.format(datetime1).equals(sdf.format(datetime2));
    }

    public static boolean isSameYear(Date datetime1, Date datetime2) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        return sdf.format(datetime1).equals(sdf.format(datetime2));
    }

    public static boolean isSameWeek(Date datetime1, Date datetime2) {
        boolean result = false;
        int year1 = getYear(datetime1);
        int year2 = getYear(datetime2);
        int month1 = getMonthOfYear(datetime1);
        int month2 = getMonthOfYear(datetime2);
        int dayOfWeek1 = getDayOfWeek(datetime1);
        int dayOfWeek2 = getDayOfWeek(datetime2);
        long diffDays = diffDays(datetime1, datetime2);
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(2);
        if (Math.abs(diffDays) < calendar.getMaximum(7)) {if (year1 == year2) {if (getWeekOfYear(datetime1) == getWeekOfYear(datetime2)) {result = true;}
            } else if ((year1 - year2 == 1) && (month1 == 1) && (month2 == 12)) {calendar.set(year1, 0, 1);
                int dayOfWeek = getDayOfWeek(calendar.getTime());
                if ((dayOfWeek2 < dayOfWeek) && (dayOfWeek <= dayOfWeek1)) {result = true;}
            } else if ((year2 - year1 == 1) && (month1 == 12) && (month2 == 1)) {calendar.set(year2, 0, 1);
                int dayOfWeek = getDayOfWeek(calendar.getTime());
                if ((dayOfWeek1 < dayOfWeek) && (dayOfWeek <= dayOfWeek2)) {result = true;}
            }
        }
        return result;
    }
}

参考资料

Java 中罕用的 Date 类型
https://blog.csdn.net/qiuwenjie123/article/details/79846621
Calendar 类简介
https://blog.csdn.net/qq_42815754/article/details/95896544
java 中 time 的工夫类
https://blog.csdn.net/ppppppushcar/article/details/113704597
Java 日期格式化:DateFormat 类和 SimpleDateFormat 类详解
https://blog.csdn.net/eguid/article/details/116054105

退出移动版