Java日期工具類的封裝詳解
概述
在日常的開(kāi)發(fā)中,我們難免會(huì)對(duì)日期格式化,對(duì)日期進(jìn)行計(jì)算,對(duì)日期進(jìn)行校驗(yàn),為了避免重復(fù)寫(xiě)這些瑣碎的邏輯,我這里封裝了一個(gè)日期工具類,方便以后使用,直接復(fù)制代碼到項(xiàng)目中即可使用。
日期工具類代碼:
import org.apache.commons.lang3.StringUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.ZoneId;
import java.util.*;
import java.util.regex.Pattern;
/**
* 常用日期工具類
*
* @author compass
* @date 2022/10/21 14:20
* @since 1.0.0
**/
public class DateTools {
public final static String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public final static String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public final static String DEFAULT_DATE_FORMAT_SHORT = "yyMMdd";
public final static String DEFAULT_YEAR_MODTH_SHORT = "yyyyMM";
public final static String DEFAULT_TIME_FORMAT_SHORT = "HHmmss";
public final static String DEFAULT_DATETIME_FORMAT_SHORT = "yyMMddHHmmss";
public final static String DEFAULT_DATE_FORMAT_ALLSHORT = "yyyyMMdd";
public static final String SIMPLE_DATE_STR = "yyyy-MM-dd";
public static final String FULL_DATE_STR = "yyyy-MM-dd HH:mm:ss";
public static final String ALL_FULL_DATE_STR = "yyyy-MM-dd HH:mm:ss.S";
public static final String PART_DATE_STR = "yyyy-MM-dd HH:mm";
public static final String DATEFORMAT_Y2H = "yyyy-MM-dd HH";
public static final String SIMPLE_RULE_DATE_STR = "yyyy/MM/dd";
public static final String FULL_RULE_DATE_STR = "yyyy/MM/dd HH:mm:ss";
public static final String PART_RULE_DATE_STR = "yyyy/MM/dd HH:mm";
public static final String SMALL_PART_RULE_DATE_STR = "HH:mm";
public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";
public static final String DATE_FORMAT_YYYYMMDDHH = "yyyyMMddHH";
public static final String DATE_FORMAT_YYYYMMDDHHMM = "yyyyMMddHHmm";
public static final String DATE_FORMAT_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static final String SIMPLE_POINT_DATE_STR = "yyyy.MM.dd";
public static final String FULL_POINT_DATE_STR = "yyyy.MM.dd HH:mm:ss";
/**
* 鎖對(duì)象
*/
private static final Object lockObj = new Object();
/**
* 存放不同格式的線程安全的SimpleDateFormat
*/
private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<>();
public enum DateType {
YEAR("YEAR", 1),
MONTH("MONTH", 2),
DAY("DAY", 3),
HOUR("HOUR", 4),
MINUTE("MINUTE", 5),
SECOND("SECOND", 6);
private String name;
private int value;
DateType(String name, int value) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
}
/**
* 返回一個(gè)ThreadLocal的sdf,每個(gè)線程只會(huì)new一次sdf
*
* @param pattern
* @return
*/
private static SimpleDateFormat getSdf(final String pattern) {
ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);
if (tl == null) {
synchronized (lockObj) {
tl = sdfMap.get(pattern);
if (tl == null) {
tl = ThreadLocal.withInitial(() -> new SimpleDateFormat(pattern));
sdfMap.put(pattern, tl);
}
}
}
return tl.get();
}
private static String[] supportFmt = new String[]{ALL_FULL_DATE_STR, SIMPLE_DATE_STR,DATE_FORMAT_YYYYMMDDHHMMSS, DEFAULT_YEAR_MODTH_SHORT, DEFAULT_TIME_FORMAT, DEFAULT_DATE_FORMAT_SHORT};
private static String checkFmt(String datestr) {
if (datestr == null)
return null;
int len = datestr.length();
if (len == 0)
return null;
String fmt;
switch (len) {
case 19:
fmt = supportFmt[0];
break;
case 10:
fmt = supportFmt[1];
break;
case 14:
fmt = supportFmt[2];
break;
case 6:
fmt = supportFmt[3];
break;
case 8: {
if (datestr.indexOf(":") > 0) {
fmt = supportFmt[4];
} else {
fmt = supportFmt[5];
}
}
break;
default:
return null;
}
return fmt;
}
/**
* 日期格式,正則表達(dá)式
*/
private static String[] supportFmtPattern = new String[]{
"\\d{4}\\-\\d{1,2}\\-\\d{1,2}", "yyyy-MM-dd",
"\\d{4}-\\d{1,2}-\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd HH:mm:ss",
"\\d{1,2}:\\d{1,2}:\\d{1,2}", "HH:mm:ss",
"\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}", "HH:mm:ss.SSS",
"\\d{4}年\\d{1,2}月\\d{1,2}日", "yyyy年MM月dd日",
"\\d{4}-\\d{1,2}-\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}", "yyyy-MM-dd HH:mm:ss.SSS",
"\\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])", "yyyyMMddHHmmss",
"\\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])", "yyyyMMdd",
"\\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])\\d{1,3}", "yyyyMMddHHmmssSSS",
"\\d{4}(10|11|12|0[1-9])", "yyyyMM",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}", "yyyy/MM/dd",
"\\d{4}\\.\\d{1,2}\\.\\d{1,2}", "yyyy.MM.dd",
"\\d{1,2}\\-\\d{1,2}\\-\\d{4}", "MM-dd-yyyy",
"\\d{1,2}\\/\\d{1,2}\\/\\d{4}", "MM/dd/yyyy",
"\\d{1,2}\\/\\d{1,2}\\/\\d{2}", "MM/dd/yy",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy/MM/dd'T'HH:mm:ss",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy/MM/dd't'HH:mm:ss",
"\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd'T'HH:mm:ss",
"\\d{4}-\\d{1,2}-\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd't'HH:mm:ss",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z", "yyyy/MM/dd'T'HH:mm:ss.SSS'Z'",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}z", "yyyy/MM/dd't'HH:mm:ss.SSS'z'",
"\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"\\d{4}-\\d{1,2}-\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}z", "yyyy-MM-dd't'HH:mm:ss.SSS'z'"
};
/**
* 日期格式,正則表達(dá)式
*/
private static String[] supportDateFmtPattern = new String[]{
"\\d{4}\\-\\d{1,2}\\-\\d{1,2}", "yyyy-MM-dd",
"\\d{4}年\\d{1,2}月\\d{1,2}日", "yyyy年MM月dd日",
"\\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])", "yyyyMMdd",
"\\d{4}(10|11|12|0[1-9])", "yyyyMM",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}", "yyyy/MM/dd",
"\\d{4}\\.\\d{1,2}\\.\\d{1,2}", "yyyy.MM.dd",
"\\d{1,2}\\-\\d{1,2}\\-\\d{4}", "MM-dd-yyyy",
"\\d{1,2}\\/\\d{1,2}\\/\\d{4}", "MM/dd/yyyy",
"\\d{1,2}\\/\\d{1,2}\\/\\d{2}", "MM/dd/yy"
};
/**
* 時(shí)間格式,正則表達(dá)式
*/
private static String[] supportTimeFmtPattern = new String[]{
"\\d{4}-\\d{1,2}-\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd HH:mm:ss",
"\\d{1,2}:\\d{1,2}:\\d{1,2}", "HH:mm:ss",
"\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}", "HH:mm:ss.SSS",
"\\d{4}-\\d{1,2}-\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}", "yyyy-MM-dd HH:mm:ss.SSS",
"\\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])", "yyyyMMddHHmmss",
"\\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])\\d{1,3}", "yyyyMMddHHmmssSSS",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy/MM/dd'T'HH:mm:ss",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy/MM/dd't'HH:mm:ss",
"\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd'T'HH:mm:ss",
"\\d{4}-\\d{1,2}-\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}", "yyyy-MM-dd't'HH:mm:ss",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z", "yyyy/MM/dd'T'HH:mm:ss.SSS'Z'",
"\\d{4}\\/\\d{1,2}\\/\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}z", "yyyy/MM/dd't'HH:mm:ss.SSS'z'",
"\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"\\d{4}-\\d{1,2}-\\d{1,2}t\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}z", "yyyy-MM-dd't'HH:mm:ss.SSS'z'"
};
/**
* 根據(jù)日期時(shí)間串推斷日期格式
*
* @param datestr 日期字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String checkFmtByPattern(String datestr) {
if (datestr == null)
return null;
for (int i = 0; i < supportFmtPattern.length; i += 2) {
if (Pattern.matches(supportFmtPattern[i], datestr)) {
return supportFmtPattern[i + 1];
}
}
return null;
}
/**
* 根據(jù)字符串格式自動(dòng)判斷日期格式,支持11種 <br>
* yyyy-MM-dd HH:mm:ss.SSS <br>
* yyyy-MM-dd HH:mm:ss <br>
* yyyy-MM-dd <br>
* yyyy.MM.dd <br>
* yyyy/MM/dd <br>
* HH:mm:ss.SSS <br>
* HH:mm:ss <br>
* yyyyMMdd <br>
* yyyyMMddHHmmssSSS <br>
* yyyyMMddHHmmss <br>
* yyyyMM <br>
*
* @param datestr
* @return
*/
public static Date parse(String datestr) {
String fmt = checkFmtByPattern(datestr);
return parse(datestr, fmt);
}
/**
* 獲取yyyy-MM-dd日期類型
*
* @param dateStr 日期字符串
* @param fmt 日期格式
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date parse(String dateStr, String fmt) {
try {
return getSdf(fmt).parse(dateStr);
} catch (NullPointerException | ParseException e) {
throw new RuntimeException(String.format("不支持的時(shí)間格式,[%s]", dateStr));
}
}
/**
* 獲取yyyy-MM-dd日期類型
*
* @param datestr 日期字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date parseDay(String datestr) {
try {
return getSdf(supportFmt[1]).parse(datestr);
} catch (ParseException e) {
throw new RuntimeException("不支持的時(shí)間格式");
}
}
/**
* 獲取yyyy-MM-dd HH:mm:ss日期類型
*
* @param datestr 日期字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date parseDayTime(String datestr) {
try {
return getSdf(supportFmt[0]).parse(datestr);
} catch (ParseException e) {
throw new RuntimeException("不支持的時(shí)間格式");
}
}
/**
* 將日期格式化成指定格式
*
* @param dt 日期
* @param dt 格式字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String format(Date dt, String... pattern) {
if (pattern != null && pattern.length > 1) {
throw new RuntimeException("日期格式字符串,只支持一個(gè)");
}
String format = pattern.length <= 0 ?DEFAULT_DATETIME_FORMAT : pattern[0];
return getSdf(format).format(dt);
}
/**
* 將日期格式化為yyyy-MM-dd HH:mm:ss
*
* @param dt 日期
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String formatDayTime(Date dt) {
return getSdf(supportFmt[0]).format(dt);
}
/**
* 將日期格式化為yyyy-MM-dd
*
* @param dt 開(kāi)日期
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String formatDay(Date dt) {
return getSdf(supportFmt[1]).format(dt);
}
/**
* 將日期格式化為HH:mm:ss
*
* @param dt 開(kāi)日期
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String formatTime(Date dt) {
return getSdf(supportFmt[4]).format(dt);
}
/**
* 計(jì)算月份差[日期型],按月份計(jì)算忽略天數(shù)
*
* @param fromDate 開(kāi)始日期
* @param toDate 結(jié)束日期
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Integer monthBetween(Date fromDate, Date toDate) {
if ((fromDate == null) || (toDate == null)) {
return null;
}
int times = 1;
if (!fromDate.after(toDate)) {
Calendar calFrom = Calendar.getInstance();
Calendar calTo = Calendar.getInstance();
calFrom.setTime(fromDate);
calFrom.set(Calendar.DAY_OF_MONTH, 1);
calTo.setTime(toDate);
calTo.set(Calendar.DAY_OF_MONTH, 1);
while (calFrom.before(calTo)) {
calFrom.add(2, 1);
times++;
}
} else {
return 0;
}
return times;
}
/**
* 計(jì)算月份差(字符型),自動(dòng)判定格式
*
* @param fromDate 開(kāi)始日期
* @param toDate 結(jié)束日期
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Integer monthBetween(String fromDate, String toDate) {
if ((fromDate == null) || (toDate == null)) {
return null;
}
return monthBetween(parse(fromDate), parse(toDate));
}
/**
* 計(jì)算天數(shù)差
*
* @param from 開(kāi)始日期
* @param end 結(jié)束日期
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Integer daysBetween(Date from, Date end) {
if ((from == null) || (end == null)) {
return null;
}
long fromL = from.getTime();
long endL = end.getTime();
double diff = (endL - fromL) / 86400000L;
return new Integer(new Double(Math.ceil(diff)).intValue());
}
/**
* 計(jì)算天數(shù)差
*
* @param from 開(kāi)始日期
* @param end 結(jié)束日期
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Integer dayBetween(String from, String end) {
if ((from == null) || (end == null)) {
return null;
}
return daysBetween(parse(from), parse(end));
}
/**
* 日期年月加減 +天
*
* @param date 日期
* @param adds 天數(shù)
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date addDay(Date date, int adds) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, adds);
return cal.getTime();
}
/**
* 日期字符串年月加減 +天
*
* @param date 日期字符串
* @param adds 天數(shù)
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String addDay(String date, int adds) {
String fmt = checkFmtByPattern(date);
Date r = addDay(parse(date), adds);
return format(r, fmt);
}
/**
* 日期年月加減 +月
*
* @param date 日期
* @param adds 天數(shù)
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date addMonth(Date date, int adds) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, adds);
return cal.getTime();
}
/**
* 日期年月加減 +月
*
* @param date 日期字符串
* @param adds 天數(shù)
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String addMonth(String date, int adds) {
String fmt = checkFmtByPattern(date);
Date r = addMonth(parse(date), adds);
return format(r, fmt);
}
/**
* 日期年月加減 +年
*
* @param date 日期
* @param adds 天數(shù)
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date addYear(Date date, int adds) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.YEAR, adds);
return cal.getTime();
}
/**
* 日期年月加減 +年
*
* @param date 日期字符串
* @param adds 天數(shù)
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String addYear(String date, int adds) {
String fmt = checkFmtByPattern(date);
Date r = addYear(parse(date), adds);
return format(r, fmt);
}
/**
* 返回當(dāng)前日期
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static Date getNowDate() {
return new Date();
}
/**
* 返回當(dāng)前日期字符串
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static String getNowStr(String format) {
return getSdf(format).format(new Date());
}
/**
* 返回當(dāng)前年
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static int getNowYear() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.YEAR);
}
/**
* 返回當(dāng)前月
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static int getNowMonth() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.MONTH);
}
/**
* 獲取今天是多少號(hào)
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static int getNowDay() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* 返回當(dāng)前日期是今年的第幾天
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static int getNowDayOfYear() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DAY_OF_YEAR);
}
/**
* 獲取今天是星期幾
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 11:10
* @since 1.0.0
**/
public static int getNowDayOfWeek() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DAY_OF_WEEK) - 1;
}
/**
* 獲取日期字符串的某一個(gè)時(shí)間單位
*
* @param dateStr 日期字符串
* @param format 日期格式化模式 默認(rèn):yyyy/MM/dd
* @param unit 獲取的日期單位
* @return int
* @author compass
* @date 2022/9/14
* @since 1.0.0
**/
public static int getDateUnit(String dateStr, String format, DateTools.DateType unit) {
int type = unit.getValue();
format = StringUtils.isNotBlank(format) ? format : DEFAULT_DATETIME_FORMAT;
SimpleDateFormat sdf = new SimpleDateFormat(format);
Calendar startCalendar = Calendar.getInstance();
Date dateTime = null;
try {
dateTime = sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("日期格式錯(cuò)誤");
}
startCalendar.setTime(dateTime);
int year = startCalendar.get(Calendar.YEAR);
int month = startCalendar.get(Calendar.MONTH) + 1;
int day = startCalendar.get(Calendar.DAY_OF_MONTH);
int hour = startCalendar.get(Calendar.HOUR_OF_DAY);
int minute = startCalendar.get(Calendar.MINUTE);
int second = startCalendar.get(Calendar.SECOND);
switch (type) {
case 1:
return year;
case 2:
return month;
case 3:
return day;
case 4:
return hour;
case 5:
return minute;
case 6:
return second;
default:
throw new RuntimeException("日期單位不正確");
}
}
/**
* 計(jì)算距離生日還有多少天
*
* @param date:生日日期
* @param format:日期格式 默認(rèn):yyyy-MM-dd
*/
public static int getBirthDay(String date, String... format) {
if (format != null && format.length > 1) {
throw new RuntimeException("日期格式字符串,只支持一個(gè)");
}
int days = 0;
try {
SimpleDateFormat myFormatter = new SimpleDateFormat(format.length <= 0 ? "yyyy-MM-dd" : format[0]);
String cliDate = date;
Calendar cToday = Calendar.getInstance(); // 存今天
Calendar cBirth = Calendar.getInstance(); // 存生日
cBirth.setTime(myFormatter.parse(cliDate)); // 設(shè)置生日
cBirth.set(Calendar.YEAR, cToday.get(Calendar.YEAR)); // 修改為本年
if (cBirth.get(Calendar.DAY_OF_YEAR) < cToday.get(Calendar.DAY_OF_YEAR)) {
// 生日已經(jīng)過(guò)了,要算明年的了
days = cToday.getActualMaximum(Calendar.DAY_OF_YEAR) - cToday.get(Calendar.DAY_OF_YEAR);
days += cBirth.get(Calendar.DAY_OF_YEAR);
} else {
// 生日還沒(méi)過(guò)
days = cBirth.get(Calendar.DAY_OF_YEAR) - cToday.get(Calendar.DAY_OF_YEAR);
}
} catch (ParseException e) {
e.printStackTrace();
}
return days;
}
/**
* 獲取服務(wù)器啟動(dòng)時(shí)間
*
* @return java.util.Date
* @author compass
* @date 2022/10/21 14:40
* @since 1.0.0
**/
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 獲取服務(wù)器啟動(dòng)時(shí)間
*
* @param format 日期格式 默認(rèn) yyyy-MM-dd HH:mm:ss
* @return java.util.Date
* @author compass
* @date 2022/10/21 14:40
* @since 1.0.0
**/
public static String getServerStartDateFormat(String... format) {
if (format != null && format.length > 1) {
throw new RuntimeException("日期格式字符串,只支持一個(gè)");
}
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return format(new Date(time), format.length <= 0 ? DEFAULT_DATETIME_FORMAT : format[0]);
}
/**
* 格式化時(shí)間
*
* @param sec 秒
* @return java.lang.String
* @author compass
* @date 2022/10/21 14:46
* @since 1.0.0
**/
private static String NumFormat(long sec) {
if (String.valueOf(sec).length() < 2) {
return "0" + sec;
} else {
return String.valueOf(sec);
}
}
/**
* 秒轉(zhuǎn)小時(shí)分
*
* @param second 秒
* @return java.lang.String
* @author compass
* @date 2022/10/21 14:46
* @since 1.0.0
**/
public static String getFormatTime(Long second) {
if (second != null) {
if (second < 3600) {//分
return NumFormat(second / 60) + "分";
}
if (second < 3600 * 24) {//時(shí)
return NumFormat(second / 60 / 60) + "小時(shí)" + NumFormat(second / 60 % 60) + "分";
}
if (second >= 3600 * 24) {//天
return NumFormat(second / 60 / 60 / 24) + "天" + NumFormat(second / 60 / 60 % 24) + "小時(shí)" + NumFormat(second / 60 % 60) + "分";
}
}
return "--";
}
/**
* 獲取當(dāng)前時(shí)間前面某天或者后面某天
*
* @param date 日期
* @param amount 相隔天數(shù),正數(shù)表示未來(lái)日期,負(fù)數(shù)表示過(guò)去日期
* @return java.util.Date
* @author compass
* @date 2022/10/21 14:49
* @since 1.0.0
**/
public static Date getOtherDay(Date date, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, amount);
Date time = calendar.getTime();
return time;
}
/**
* 獲取周幾
*
* @param date
* @return
*/
public static String getWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int weekday = calendar.get(Calendar.DAY_OF_WEEK);
String week = null;
if (weekday == 1) {
week = "星期天";
} else if (weekday == 2) {
week = "星期一";
} else if (weekday == 3) {
week = "星期二";
} else if (weekday == 4) {
week = "星期三";
} else if (weekday == 5) {
week = "星期四";
} else if (weekday == 6) {
week = "星期五";
} else if (weekday == 7) {
week = "星期六";
}
return week;
}
/**
* 判斷是不是本周
*
* @param date 日期
* @return boolean
* @author compass
* @date 2022/10/21 14:54
* @since 1.0.0
**/
public static boolean isThisWeek(Date date) {
Calendar calendar = Calendar.getInstance();
int currentWeek = calendar.get(Calendar.WEEK_OF_YEAR);
calendar.setTime(date);
int dateWeek = calendar.get(Calendar.WEEK_OF_YEAR);
if (currentWeek == dateWeek) {
return true;
}
return false;
}
/**
* 判斷是不是本周
*
* @param date 日期
* @param format 日期格式字符
* @return boolean
* @author compass
* @date 2022/10/21 14:54
* @since 1.0.0
**/
public static boolean isThisWeek(String date, String format) {
Calendar calendar = Calendar.getInstance();
int currentWeek = calendar.get(Calendar.WEEK_OF_YEAR);
calendar.setTime(parse(date, format));
int dateWeek = calendar.get(Calendar.WEEK_OF_YEAR);
if (currentWeek == dateWeek) {
return true;
}
return false;
}
/**
* 判斷當(dāng)前時(shí)間
*
* @param date 日期
* @param format 日期格式
* @return boolean
* @author compass
* @date 2022/10/21 15:01
* @since 1.0.0
**/
private static boolean isThisTime(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String dateFormat = sdf.format(date);
String nowFormat = sdf.format(new Date());
if (dateFormat.equals(nowFormat)) {
return true;
}
return false;
}
/**
* 判斷是否是當(dāng)天
*
* @param date 日期
* @return boolean
* @author compass
* @date 2022/10/21 15:01
* @since 1.0.0
**/
public static boolean isThisDay(Date date) {
return isThisTime(date, "YYYY-MM-dd");
}
/**
* 判斷是否是本月
*
* @param date 日期
* @return boolean
* @author compass
* @date 2022/10/21 15:01
* @since 1.0.0
**/
public static boolean isThisMonth(Date date) {
return isThisTime(date, "YYYY-MM-dd");
}
/**
* 獲取某月開(kāi)始時(shí)間
*
* @param date 日期
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthBeginTime(Date date) {
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
YearMonth yearMonth = YearMonth.of(localDateTime.getYear(), localDateTime.getMonth());
LocalDate localDate = yearMonth.atDay(1);
return localDate.atStartOfDay();
}
/**
* 獲取某月開(kāi)始時(shí)間
*
* @param date 日期字符串
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthBeginTime(String date) {
return getMonthBeginTime(parse(date));
}
/**
* 獲取某月結(jié)束時(shí)間
*
* @param date 日期
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthEndTime(Date date) {
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
YearMonth yearMonth = YearMonth.of(localDateTime.getYear(), localDateTime.getMonth());
LocalDate endOfMonth = yearMonth.atEndOfMonth();
return endOfMonth.atTime(23, 59, 59, 999);
}
/**
* 獲取某月結(jié)束時(shí)間
*
* @param date 日期字符串
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthEndTime(String date) {
return getMonthEndTime(parse(date));
}
/**
* 獲取指定時(shí)間范圍內(nèi)的所有日期[date]
* @param dBegin 開(kāi)始日期
* @param dEnd 結(jié)束日期
* @return java.util.List<java.util.Date>
* @author compass
* @date 2022/10/21 17:11
* @since 1.0.0
**/
public static List<Date> findBetweenAll(Date dBegin, Date dEnd) {
List<Date> dateList = new ArrayList<>();
Calendar calBegin = Calendar.getInstance();
// 使用給定的 Date 設(shè)置此 Calendar 的開(kāi)始時(shí)間
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
// 使用給定的 Date 設(shè)置此 Calendar 的結(jié)束時(shí)間
calEnd.setTime(dEnd);
// 測(cè)試此日期是否在指定日期之后
while (dEnd.after(calBegin.getTime())) {
// 根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
dateList.add(calBegin.getTime());
}
return dateList;
}
/**
* 獲取指定時(shí)間范圍內(nèi)的所有日期[字符串]
* @param dBegin 開(kāi)始日期
* @param dEnd 結(jié)束日期
* @param format 日期格式字符串
* @return java.util.List<java.util.Date>
* @author compass
* @date 2022/10/21 17:11
* @since 1.0.0
**/
public static List<String> findBetweenAll(String dBegin, String dEnd,String format) {
Date tempEndDate = parse(dEnd);
List<String> dateList = new ArrayList<>();
Calendar calBegin = Calendar.getInstance();
// 使用給定的 Date 設(shè)置此 Calendar 的開(kāi)始時(shí)間
calBegin.setTime(parse(dBegin));
Calendar calEnd = Calendar.getInstance();
// 使用給定的 Date 設(shè)置此 Calendar 的結(jié)束時(shí)間
calEnd.setTime(tempEndDate);
// 測(cè)試此日期是否在指定日期之后
while (tempEndDate.after(calBegin.getTime())) {
// 根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
String date = format( calBegin.getTime(),format);
dateList.add(date);
}
return dateList;
}
}
以上就是Java日期工具類的封裝詳解的詳細(xì)內(nèi)容,更多關(guān)于Java日期工具類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot熱部署和整合Mybatis的過(guò)程
熱部署,就是在應(yīng)用正在運(yùn)行的時(shí)候升級(jí)軟件,卻不需要重新啟動(dòng)應(yīng)用,本文給大家詳細(xì)介紹SpringBoot熱部署和整合Mybatis的過(guò)程,感興趣的朋友跟隨小編一起看看吧2023-10-10
Java設(shè)計(jì)模式之命令模式CommandPattern詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式CommandPattern詳解,命令模式是把一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷的操作,需要的朋友可以參考下2023-10-10
Java中List轉(zhuǎn)Map的幾種常見(jiàn)方式與對(duì)比
JavaList轉(zhuǎn)Map是一個(gè)非常常用的技術(shù),對(duì)于Java開(kāi)發(fā)人員來(lái)講,掌握該技術(shù)可以幫助我們更加高效地操作List集合中的對(duì)象,這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)Map的幾種常見(jiàn)方式與對(duì)比的相關(guān)資料,需要的朋友可以參考下2024-02-02
Springboot配置文件內(nèi)容加密代碼實(shí)例
這篇文章主要介紹了Springboot配置文件內(nèi)容加密代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
arthas排查jvm中CPU占用過(guò)高問(wèn)題解決
這篇文章主要介紹了arthas排查jvm中CPU占用過(guò)高問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Spring Security使用單點(diǎn)登錄的權(quán)限功能
本文主要介紹了Spring Security使用單點(diǎn)登錄的權(quán)限功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
SpringBoot?整合Redis?數(shù)據(jù)庫(kù)的方法
Redis是一個(gè)基于內(nèi)存的日志型可持久化的緩存數(shù)據(jù)庫(kù),保存形式為key-value格式,Redis完全免費(fèi)開(kāi)源,它使用ANSI?C語(yǔ)言編寫(xiě)。這篇文章主要介紹了SpringBoot?整合Redis?數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2018-03-03
IntellJ idea使用FileWatch實(shí)時(shí)編譯less文件的方法
這篇文章主要介紹了IntellJ idea使用FileWatch實(shí)時(shí)編譯less文件的相關(guān)資料,需要的朋友可以參考下2018-02-02

