最近总结了一下时间相关的用法,如下。
1、日期转换为字符串 默认"yyyy-MM-dd HH:mm:ss"
2、任意类型日期字符串转时间
3、获取当前对应格式的日期
4、获取当前对应格式的日期 默认"yyyyMMddHHmmssSSS"
5、计算该天是星期几
6、获取星期几,java中一周中的数字 转 常规一周中的数字
7、根据日期获取星期
8、获取一个月的开始和结束时间
9、获取一年的开始和结束时间
10、获取季度
11、获取某月 所有日期(yyyy-mm-dd格式字符串)
12、获取一周的开始和结束时间
13、获取某周 所有日期(yyyy-mm-dd格式字符串)
14、 计算两个日期之间相差的秒数
15、计算两个日期之间相差的天数
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.*;/*** 时间工具类*/
public class DateUtils {private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";private static final String DATE_FORMAT = "yyyy-MM-dd";private static final String DATE_SIMPLE_FORMAT = "yyyyMMdd";//====================================时间转换=======================================>>/*** 时长转换** @param time 通话时长(秒)* @return 几小时几分钟几秒*/public static String getStrTime(Integer time) {if (time == null || time == 0) return "";StringBuilder str = new StringBuilder();int hour = time / 3600;if (hour != 0) str.append(hour).append("小时");int minutes = (time - hour * 3600) / 60;if (minutes != 0) str.append(minutes).append("分钟");int seconds = time - hour * 3600 - minutes * 60;if (seconds != 0) str.append(seconds).append("秒");return str.toString();}public static String millisToStr(long time) {if (time <= 0) return "0 秒";if (time < 1000) {return (time / 1000.0f) + "秒";}return getStrTime((int) time / 1000);}public static String millisDiff(long time) {return millisToStr(System.currentTimeMillis() - time);}/*** 日期转换为字符串 默认"yyyy-MM-dd HH:mm:ss"** @param date 日期*/public static String dateToStr(Date date) {return dateToStr(date, null);}/*** 日期转换为字符串** @param date 日期* @param format 日期格式*/public static String dateToStr(Date date, String format) {if (date == null) return null;// 如果没有指定字符串转换的格式,则用默认格式进行转换if (null == format || "".equals(format) || "Datetime".equals(format)) {format = DATETIME_FORMAT;} else if ("Timestamp".equals(format)) {format = TIMESTAMP_FORMAT;} else if ("Date".equals(format)) {format = DATE_FORMAT;} else if ("DateSimple".equals(format)) {format = DATE_SIMPLE_FORMAT;} else if ("Simple".equals(format)) {format = DATE_SIMPLE_FORMAT;}SimpleDateFormat sdf = new SimpleDateFormat(format);return sdf.format(date);}/*** 任意类型日期字符串转时间*/public static Date strToDate(String time) {if (StringUtils.isBlank(time)) return null;SimpleDateFormat formatter;int tempPos = time.indexOf("AD");time = time.trim();formatter = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");if (tempPos > -1) {time = time.substring(0, tempPos) +"公元" + time.substring(tempPos + "AD".length());//chinaformatter = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");}if (time.contains(".")) time = time.replaceAll("\\.", "/");if (time.contains("-")) time = time.replaceAll("-", "/");if (!time.contains("/") && !time.contains(" ")) {formatter = new SimpleDateFormat("yyyyMMddHHmmss");} else if (time.contains("/")) {if (time.contains("am") || time.contains("pm")) formatter = new SimpleDateFormat("yyyy/MM/dd KK:mm:ss a");else if (time.contains(" ")) formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");else {String[] dateArr = time.split("/");if (dateArr.length == 2 || (dateArr.length == 3 && StringUtils.isBlank(dateArr[2])))formatter = new SimpleDateFormat("yyyy/MM");else formatter = new SimpleDateFormat("yyyy/MM/dd");}}ParsePosition pos = new ParsePosition(0);return formatter.parse(time, pos);}public static Date strToDate(String time, String formatterString) {if (StringUtils.isBlank(time) || StringUtils.isBlank(formatterString)) return null;SimpleDateFormat formatter = new SimpleDateFormat(formatterString);ParsePosition pos = new ParsePosition(0);return formatter.parse(time, pos);}public static Date strToDateThrow(String time) {if (StringUtils.isBlank(time)) return null;Date value = strToDate(time);Assert.notNull(value, "无法识别日期格式: " + value);return value;}//====================================时间获取=======================================>>/*** 获取当前对应格式的日期*/public static String getDateStr() {return getDateStr(null);}/*** 获取当前对应格式的日期 默认"yyyyMMddHHmmssSSS"** @param format 日期格式*/public static String getDateStr(String format) {if (null == format || "".equals(format)) {format = "yyyyMMddHHmmssSSS";}Date date = new Date();SimpleDateFormat df = new SimpleDateFormat(format);return df.format(date);}/*** 获取星期几,java中一周中的数字 转 常规一周中的数字* java中 周日=1 周六=7* eg:* 周一 -> 1* 周日 -> 7** @param dayOfWeek java中一周中的数字*/public static int getIsoDayOfWeek(int dayOfWeek) {int result;if (dayOfWeek == 1) {result = 7;} else {result = dayOfWeek - 1;}return result;}/*** 根据日期获取星期*/public static String getWeekOfDate(Date date) {String[] weekDays = {"sun", "mon", "tue", "wed", "thu", "fri", "sat"};Calendar cal = Calendar.getInstance();cal.setTime(date);int w = cal.get(Calendar.DAY_OF_WEEK) - 1;if (w < 0) w = 0;return weekDays[w];}//获取一个月的开始和结束时间public static List getMonthFirstAndEndDay(Date date) {List result = new ArrayList<>();Calendar c = Calendar.getInstance();c.setTime(date);c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);c.set(Calendar.DAY_OF_MONTH, 1);//设置为1号result.add(c.getTime());c.add(Calendar.MONTH, 1);//加一个月c.add(Calendar.MILLISECOND, -1);//减一毫秒result.add(c.getTime());return result;}//获取一年的开始和结束时间public static List getYearFirstAndEndDay(Date date) {List result = new ArrayList<>();Calendar c = Calendar.getInstance();c.setTime(date);c.set(Calendar.MONTH, 0);c.set(Calendar.DATE, 1);c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);result.add(c.getTime());c.add(Calendar.YEAR, 1);//加一年c.add(Calendar.MILLISECOND, -1);//减一毫秒result.add(c.getTime());return result;}public static Date getYearStartTime(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.YEAR, 0);calendar.add(Calendar.DATE, 0);calendar.add(Calendar.MONTH, 0);calendar.set(Calendar.DAY_OF_YEAR, 1);calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);return calendar.getTime();}/*** 获取季度*/public static int getQuarter(Date date) {int quarter = 0;Calendar c = Calendar.getInstance();c.setTime(date);int month = c.get(Calendar.MONTH);switch (month) {case Calendar.JANUARY:case Calendar.FEBRUARY:case Calendar.MARCH:quarter = 1;break;case Calendar.APRIL:case Calendar.MAY:case Calendar.JUNE:quarter = 2;break;case Calendar.JULY:case Calendar.AUGUST:case Calendar.SEPTEMBER:quarter = 3;break;case Calendar.OCTOBER:case Calendar.NOVEMBER:case Calendar.DECEMBER:quarter = 4;break;}return quarter;}/*** 获取某月 所有日期(yyyy-mm-dd格式字符串)*/public static List getMonthFullDay(Date date) {SimpleDateFormat dateFormatYYYYMMDD = new SimpleDateFormat(DATE_FORMAT);List fullDayList = new ArrayList<>();// 获得当前日期对象Calendar c = Calendar.getInstance();c.setTime(date);c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);// 当月1号c.set(Calendar.DAY_OF_MONTH, 1);int count = c.getActualMaximum(Calendar.DAY_OF_MONTH);for (int j = 1; j <= count; j++) {fullDayList.add(dateFormatYYYYMMDD.format(c.getTime()));c.add(Calendar.DAY_OF_MONTH, 1);}return fullDayList;}/*** 获取一周的开始和结束时间*/public static List dateToWeekStartAndEnd(Date date) {List result = new ArrayList<>();Calendar c = Calendar.getInstance();c.setTime(date);c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);c.set(Calendar.DAY_OF_WEEK, 2);//设置为星期1result.add(c.getTime());c.add(Calendar.DAY_OF_WEEK_IN_MONTH, 1);//加一个周c.add(Calendar.MILLISECOND, -1);//减一毫秒result.add(c.getTime());return result;}/*** 获取某周 所有日期(yyyy-mm-dd格式字符串)*/public static List getWeekFullDay(Date date) {SimpleDateFormat dateFormatYYYYMMDD = new SimpleDateFormat(DATE_FORMAT);List fullDayList = new ArrayList<>();// 获得当前日期对象Calendar c = Calendar.getInstance();c.setTime(date);c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);//周一c.set(Calendar.DAY_OF_WEEK, 2);int count = c.getActualMaximum(Calendar.DAY_OF_WEEK);for (int j = 1; j <= count; j++) {fullDayList.add(dateFormatYYYYMMDD.format(c.getTime()));c.add(Calendar.DAY_OF_WEEK, 1);}return fullDayList;}/*** 获取当前date的上周的周一*/public static Date getLastWeekMonday(Date date) {Date monday = getWeekMonday(date);Date lastDate = getLastSec(monday);return getWeekMonday(lastDate);}/*** 获取当前date的所在周的周一*/public static Date getWeekMonday(Date date) {Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);return calendar.getTime();}/*** 获取一天的开始时间和结束时间*/public static List dateToDayStartAndEnd(Date date) {List result = new ArrayList<>();Calendar c = Calendar.getInstance();c.setTime(date);//将时分秒,毫秒域清零c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);result.add(c.getTime());c.add(Calendar.DAY_OF_YEAR, 1);c.add(Calendar.SECOND, -1);result.add(c.getTime());return result;}/*** 获取今天一天的开始时间和结束时间*/public static List getToday() {return dateToDayStartAndEnd(new Date());}/*** 获取 时间段内 所有日期(yyyy-mm-dd格式字符串)*/public static List getFullDay(Date startTime, Date endTime) {SimpleDateFormat dateFormatYYYYMMDD = new SimpleDateFormat(DATE_FORMAT);List fullDayList = new ArrayList<>();// 获得当前日期对象Calendar s = Calendar.getInstance();s.setTime(startTime);s.set(Calendar.HOUR_OF_DAY, 0);s.set(Calendar.MINUTE, 0);s.set(Calendar.SECOND, 0);s.set(Calendar.MILLISECOND, 0);Calendar e = Calendar.getInstance();e.setTime(endTime);e.set(Calendar.HOUR_OF_DAY, 0);e.set(Calendar.MINUTE, 0);e.set(Calendar.SECOND, 0);e.set(Calendar.MILLISECOND, 0);int daysBetween = getDaysBetween(s.getTime(), e.getTime());for (int i = 0; i <= daysBetween; i++) {fullDayList.add(dateFormatYYYYMMDD.format(s.getTime()));s.add(Calendar.DAY_OF_MONTH, 1);}return fullDayList;}//====================================时间计算=======================================>>/*** 计算两个日期之间相差的秒数** @param smdate 较小的时间* @param bdate 较大的时间* @return 相差秒数*/public static int getSecsBetween(Date smdate, Date bdate) {SimpleDateFormat sdf = new SimpleDateFormat(DATETIME_FORMAT);try {smdate = sdf.parse(sdf.format(smdate));bdate = sdf.parse(sdf.format(bdate));} catch (ParseException e) {e.printStackTrace();}Calendar cal = Calendar.getInstance();cal.setTime(smdate);long time1 = cal.getTimeInMillis();cal.setTime(bdate);long time2 = cal.getTimeInMillis();long between_days = (time2 - time1) / 1000;return Integer.parseInt(String.valueOf(between_days));}/*** 计算两个日期之间相差的天数** @param smdate 较小的时间* @param bdate 较大的时间* @return 相差天数*/public static int getDaysBetween(Date smdate, Date bdate) {int second = getSecsBetween(smdate, bdate);long between_days = second / 3600 / 24;return Integer.parseInt(String.valueOf(between_days));}/*** 根据日期判断是上午下午还是晚上** @return 1:上午 2:下午 3:晚上*/public static Integer getTimeByDate(Date date) {if (date == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);int hour = c.get(Calendar.HOUR_OF_DAY);if (hour <= 12) return 1;else if (hour <= 18) return 2;else return 3;}/*** 该天是否为月末最后一天*/public static boolean isLastDayOfMonth(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));return calendar.get(Calendar.DAY_OF_MONTH) == 1;}/*** 获取该月有多少天*/public static int getDaysOfMonth(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);}/*** 计算得到2个时间的差值,并转成中文** @param startDate 开始时间* @param endDate 结束时间*/public static String getDateDiff(Date startDate, Date endDate) {long nd = 1000 * 24 * 60 * 60;long nh = 1000 * 60 * 60;long nm = 1000 * 60;long ns = 1000;//long ns = 1000;//获得两个时间的毫秒时间差异long diff = endDate.getTime() - startDate.getTime();//计算差多少天long day = diff / nd;//计算差多少小时long hour = diff % nd / nh;//计算差多少分钟long min = diff % nd % nh / nm;//计算差多少秒//输出结果long sec = diff % nd % nh % nm / ns;String result = "";if (day > 0) result += day + "天";if (hour > 0) result += hour + "小时";if (min > 0) result += min + "分钟";if (result.isEmpty()) result = sec + "秒";return result;}/*** 计算开始时间和结束时间的差值,转成多少小时** @param startDate 开始时间* @param endDate 结束时间* @return eg: 3.21 (小时)*/public static BigDecimal getDateDiffHour(Date startDate, Date endDate) {BigDecimal nh = new BigDecimal(1000 * 60 * 60);BigDecimal diff = new BigDecimal(endDate.getTime() - startDate.getTime());return diff.divide(nh, 2, BigDecimal.ROUND_HALF_UP);}/*** 计算开始时间和结束时间的差值,转成多少天** @param startDate 开始时间* @param endDate 结束时间* @return eg: 3.21 (天)*/public static BigDecimal getDateDiffDay(Date startDate, Date endDate) {BigDecimal nh = new BigDecimal(1000 * 60 * 60 * 24);BigDecimal diff = new BigDecimal(endDate.getTime() - startDate.getTime());return diff.divide(nh, 2, BigDecimal.ROUND_HALF_UP);}//====================================获取时间段=======================================>>/*** 获取这一周的date,从周一到周日*/public static List dateToWeek(Date mdate) {Calendar c = Calendar.getInstance();c.setTime(mdate);int b = c.get(Calendar.DAY_OF_WEEK) - 1;Date fdate;List list = new ArrayList<>();long fTime = mdate.getTime() - b * 24 * 3600000;for (int a = 1; a <= 7; a++) {fdate = new Date();fdate.setTime(fTime + (a * 24 * 3600000));list.add(a - 1, fdate);}return list;}/*** 获取前几天的date*/public static List getDateListBefore(Date date, Integer num) {if (date == null) return null;List result = new ArrayList<>();Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.DATE, -num);for (int a = 1; a <= num; a++) {c.add(Calendar.DATE, 1);Date temp = c.getTime();result.add(temp);}return result;}/*** 获取一周、月、年的date*/public static List getDateListByKind(Date date, String kind) {if (date == null || kind == null) return null;Calendar end = Calendar.getInstance();Calendar c = Calendar.getInstance();c.setFirstDayOfWeek(Calendar.MONDAY);c.setTime(date);//将时分秒,毫秒域清零c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);switch (kind) {case "week":c.add(Calendar.DATE, c.getFirstDayOfWeek() - c.get(Calendar.DAY_OF_WEEK));end.setTime(c.getTime());end.add(Calendar.DATE, 7);break;case "month":c.set(Calendar.DAY_OF_MONTH, 1);end.setTime(c.getTime());end.add(Calendar.MONTH, 1);break;case "half":c.add(Calendar.MONTH, -6);c.set(Calendar.DAY_OF_MONTH, 1);end.setTime(date);end.set(Calendar.DAY_OF_MONTH, 1);end.add(Calendar.MONTH, 1);end.add(Calendar.DAY_OF_MONTH, -1);break;case "year":c.set(Calendar.DAY_OF_YEAR, 1);end.setTime(c.getTime());end.add(Calendar.YEAR, 1);break;default:return null;}boolean setSec = false;List result = new ArrayList<>();while (c.before(end)) {if (result.size() != 0 && !setSec) {//将时分秒,毫秒域清零c.set(Calendar.HOUR_OF_DAY, 23);c.set(Calendar.MINUTE, 59);c.set(Calendar.SECOND, 59);c.set(Calendar.MILLISECOND, 999);setSec = true;}result.add(c.getTime());c.add(Calendar.DATE, 1);}return result;}//====================================修改时间=======================================>>/*** 获取前一秒*/public static Date getLastSec(Date date) {if (date == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.SECOND, -1);return c.getTime();}/*** 添加秒*/public static Date getWhichSecs(Date date, int secs) {if (date == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.SECOND, secs);return c.getTime();}/*** 添加分*/public static Date getWhichMinute(Date date, int minute) {if (date == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.MINUTE, minute);return c.getTime();}/*** 获取后一天*/public static Date getNextDate(Date date) {return addDay(date, 1);}/*** 添加天*/public static Date addDay(Date date, Integer day) {if (date == null || day == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.DATE, day);return c.getTime();}/*** 添加月*/public static Date addMonth(Date date, Integer month) {if (date == null || month == null) return null;if (month == 0) return date;Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.MONTH, month);return c.getTime();}/*** 添加年*/public static Date addYear(Date date, Integer year) {if (date == null || year == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);c.add(Calendar.YEAR, year);return c.getTime();}/*** 清除时分秒*/public static Date clearTime(Date date) {Calendar c = Calendar.getInstance();c.setTime(date);//将时分秒,毫秒域清零c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);return c.getTime();}/*** 清除秒*/public static Date clearSec(Date date) {Calendar c = Calendar.getInstance();c.setTime(date);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);return c.getTime();}/*** 将时分秒设置成当前时间*/public static Date setTimeToNow(Date date) {return setTime(date, new Date());}/*** 将时分秒设置成新时间*/public static Date setTime(Date date, Date newDate) {if (date == null) return null;Calendar c = Calendar.getInstance();c.setTime(date);Calendar now = Calendar.getInstance();now.setTime(newDate);//将时分秒,毫秒域清零c.set(Calendar.HOUR_OF_DAY, now.get(Calendar.HOUR_OF_DAY));c.set(Calendar.MINUTE, now.get(Calendar.MINUTE));c.set(Calendar.SECOND, now.get(Calendar.SECOND));c.set(Calendar.MILLISECOND, now.get(Calendar.MILLISECOND));return c.getTime();}/*** Timestamp时间戳转date** @param timestamp 时间戳*/public static Date timeToDate(Timestamp timestamp) {// Timestamp -> StringSimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString = formatter.format(timestamp);return DateUtils.strToDate(dateString);}public static boolean isWorkTime() {LocalTime now = LocalTime.now();return (now.isAfter(LocalTime.of(5, 0)) && now.isBefore(LocalTime.of(18, 0))) ||now.isAfter(LocalTime.of(0, 0)) && now.isBefore(LocalTime.of(1, 0));}public static String ehrTimeTransform(String time) {if (StringUtils.isBlank(time)) return null;String format;if (time.length() == 8) {format = "yyyyMMdd";} else if (time.length() == 14) {format = "yyyyMMddHHmmss";} else {format = "yyyy-MM-dd HH:mm:ss";}return DateUtils.dateToStr(DateUtils.strToDate(time, format), "yyyy-MM-dd HH:mm:ss");}public static void awaitFreeTime() {while (isWorkTime()) {try {Thread.sleep(600000);} catch (InterruptedException e) {throw new IllegalArgumentException("任务等待失败");}}System.out.println("等待结束");}}
点点关注: